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

我相信您需要/EHa在编译时指定 SEH 异常以调用 C++ 析构函数。

如果未指定 /EH,编译器将捕获结构化异常和 C++ 异常,但不会销毁因异常而超出范围的 C++ 对象。

有关详细信息,请参阅MSDN

于 2013-01-05T19:31:39.300 回答