17
  1. このイベントを何らかの方法で処理することは可能ですか?
  2. スタックの巻き戻しと静的/グローバル オブジェクトの割り当て解除に関してはどうなりますか?
4

3 に答える 3

13

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

于 2009-05-27T08:42:00.920 に答える
7

編集:SIGTERMではなくSIGINT。また、Assaf は、未処理の SIGINT に対して (少なくとも Windows では) オブジェクトが破棄されていないと報告しています。

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

2 番目の質問は少しトリッキーで、実装に依存する場合があります。最善の策は、信号を処理することです。これによりdeleteexit()手動で使用できます。

于 2009-05-27T08:37:46.280 に答える
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 を処理する方法に応じて、実装に依存する必要があります。私の経験では、それは起こりません。

于 2009-05-27T08:49:19.640 に答える