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 を参照)、スタックの巻き戻しを実行する必要があります。つまり、この関数のフレームの下にある関数のスタック フレームをクリーンアップします。スタック フレームのクリーニングには、ちょっとした複雑さが伴います。例外ハンドラーは、例外発生時にフレーム上でアクティブな関数のすべてのローカル オブジェクトを見つけて、それらのデストラクタを呼び出さなければなりません。
何か不足していますか?