0

main()アプリケーションがクラッシュした後 (または中断された後など) に作成されたオブジェクトを破棄する簡単な方法があるかどうかを知りたいです。コードを参照してください。

#include <iostream>
#include <signal.h>
#include <stdlib.h>

class TestClass {
public:
    TestClass() { std::cerr << "Constructor" << std::endl; }
    ~TestClass() { std::cerr << "Destructor" << std::endl; }
};

void signal_handler(int signum) {
    std::cerr << "Signal caught " << signum << std::endl;
    exit(1);
}

int main() {

    TestClass a; 

    struct sigaction new_action, old_action;
    new_action.sa_handler = signal_handler;
    sigemptyset (&new_action.sa_mask);
    new_action.sa_flags = 0;

    sigaction (SIGSEGV, NULL, &old_action);
    if (old_action.sa_handler != SIG_IGN)
    {
        sigaction (SIGSEGV, &new_action, NULL);
    }
    // CRASH !!!
    int* p = 0; *p = 0;
}

そのため、実行時にクリーンアップを行い、その後終了するシグナルハンドラーをインストールします。明らかに、これは大きなアプリケーションなので、(理論的に言えば) 一時ファイルを作成したクラスのデストラクタを呼び出したいと思います。

動的に割り当てて、signal_handler(デストラクタを呼び出すために) 解放するのは簡単ですが、それには余分な作業が必要です。

また、グローバル オブジェクトである可能性もありますが、グローバルな初期化順序の問題を回避したい...

4

1 に答える 1

1

SIGSEGV で整然としたシャットダウンを調整することを試みることができます。落とし穴がないわけではありませんが、ここから始めてください: SIGSEGV の受信時に 1 つのスレッドだけを終了することは可能ですか?

シグナル ハンドラーで 1 つの問題のあるスレッドを終了し、グローバル フラグを設定して、「失敗しました。シャットダウンする時間です」と言うことができます。次に、メインのメッセージ ループでフラグを確認し、フラグが設定されている場合はブレークアウトします。

于 2014-09-04T12:13:46.070 に答える