1
class ScopedShit
{
public:
    ScopedShit() {
        cout << "ScopedShit()" << endl;
    }
    ~ScopedShit() {
        cout << "~ScopedShit()" << endl;
    }
};

void foo()
{
    ScopedShit ss;
    int x = 0;
    int y = 5 / x;
}

int main()
{
    __try {
        foo();
    }
    __except(true) {
        cout << "Continuing..." << endl;
    }
}

出力:

ScopedShit()

継続中...

私はこの記事http://www.codeproject.com/Articles/2126/How-aC-compiler-implements-exception-handlingを読んでいます。

しかし、それ (例外ハンドラー) が catch ブロックを呼び出す前に (funcinfo 構造体から catch ブロックのアドレスを認識しています。図 4 を参照)、スタックの巻き戻しを実行する必要があります。つまり、この関数のフレームの下にある関数のスタック フレームをクリーンアップします。スタック フレームのクリーニングには、ちょっとした複雑さが伴います。例外ハンドラーは、例外発生時にフレーム上でアクティブな関数のすべてのローカル オブジェクトを見つけて、それらのデストラクタを呼び出さなければなりません。

何か不足していますか?

4

1 に答える 1

4

/EHaC++ デストラクタを呼び出すには、コンパイル時に SEH 例外を指定する必要があると思います。

/EH が指定されていない場合、コンパイラは構造化例外と C++ 例外をキャッチしますが、例外の結果として範囲外になる C++ オブジェクトを破棄しません。

詳細については、 MSDNを参照してください。

于 2013-01-05T19:31:39.300 に答える