- このイベントを何らかの方法で処理することは可能ですか?
- スタックの巻き戻しと静的/グローバル オブジェクトの割り当て解除に関してはどうなりますか?
3 に答える
コンソールアプリケーションのCtrl-Cは、信号を生成します。このシグナルのデフォルトのハンドラーは、ExitProcessを呼び出してアプリケーションを終了します。SetConsoleCtrlHandler関数を使用してシグナルに独自のハンドラー関数を設定することにより、この動作をオーバーライドできます。
編集:SIGTERMではなくSIGINT。また、Assaf は、未処理の SIGINT に対して (少なくとも Windows では) オブジェクトが破棄されていないと報告しています。
システムは SIGINT を送信します。この概念は、すべての C 実装に適用されます (多少の差異はあります)。これを処理するには、シグナル ハンドラを指定して signal を呼び出します。Open GroupおよびMSDNの signal 関数に関するドキュメントを参照してください。
2 番目の質問は少しトリッキーで、実装に依存する場合があります。最善の策は、信号を処理することです。これによりdelete
、exit()
手動で使用できます。
簡単なコードを使用して、スタックの巻き戻しが発生するかどうかをテストできます。
#include <iostream>
#include <windows.h>
using namespace std;
struct A {
~A() { cerr << "unwound" << endl; }
};
int main() {
A a;
while(1) {
Sleep(1000);
}
}
発生しないかどうかは、ランタイムが Ctrl-C を処理する方法に応じて、実装に依存する必要があります。私の経験では、それは起こりません。