2009-05-27 7 views
16
  1. それはいくつかの方法でこのイベントを処理することは可能ですか?
  2. スタティック/グローバルオブジェクトのスタックの巻き戻しおよび割り当て解除に関してはどうなりますか?
+1

1:優れた質問:) –

+0

優れたハンドル:) –

答えて

7

EDIT:SIGINT、SIGTERMではありません。また、Assafは、手元にないSIGINTのオブジェクトは(少なくともWindowsでは)破壊されないと報告しています。

システムは、SIGINTを送信します。この概念は、すべてのC実装に適用されます(多少の違いはあります)。これを処理するには、signalハンドラを指定してsignalを呼び出します。信号関数については、Open GroupMSDNのドキュメントを参照してください。

2つ目の質問は少しトリッキーで、実装に依存してもよいです。最高の賭けは信号を処理することです。これによりdeleteexit()を手動で使用することができます。コンソールアプリケーションで

+0

感謝。 fyi、あなたがリンクしたMSDNページは、システムがSIGINTを送信することを示唆しています(そして、NTは上向きにSIGTERMを送信しません)。 –

+0

ありがとう、Assaf。修正されました。 –

+0

また、ExitProcessに変換されるSIGINTは、あらゆる種類のオブジェクト(グローバル、ローカル静的、自動)の破棄をトリガーしません。 otoh、sigintをexit()に変換すると、globals/staticsは初期化の逆の順序でデストラクタになります(ただし自動化されません)。 –

13

はCtrl-Cは、信号を生成します。このシグナルのデフォルトのハンドラはExitProcessを呼び出してアプリケーションを終了します。 SetConsoleCtrlHandler関数を使用して、信号の独自のハンドラ関数を設定することで、この動作を無効にすることができます。

+0

+1実際に質問に答えるために+1! –

+1

統計情報の割り当て解除はどうですか? –

4

あなたは、いくつかの簡単なコードで、スタックの巻き戻しが発生したかどうかをテストすることができます

#include <iostream> 
#include <windows.h> 
using namespace std; 

struct A { 
    ~A() { cerr << "unwound" << endl; } 
}; 

int main() { 
    A a; 
    while(1) { 
     Sleep(1000); 
    } 
} 

実行時にCtrl-Cをどのように扱うかに応じて、実装依存であるべきではない発生するかどうか。私の経験では、それは起こらない。

+0

良いテスト!私は訂正した。 –

+0

さまざまなプロジェクト構成(libs、dlls、ネイティブ、管理、マルチスレッド、それらの組み合わせなど)によって動作が異なるかどうかは決して確信できないため、このようなテストは信頼できません。だから私はむしろ "本当の"答えを持って、そのようなテストに自分自身は頼っていないだろう。 –

+0

"本当の"答えはありません - C++標準はこの件に関して何も言わないので、あなたが得るものは常に実装に依存します。 –

関連する問題