捕获SEH异常时,异常处理程序不会调用析构函数

时间:2013-01-05 19:26:10

标签: exception seh

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-a-C-compiler-implements-exception-handling,其中解释了:

  

但在它之前(异常处理程序)调用catch块(它知道catch的地址)   阻止来自funcinfo结构,见图4),它必须执行堆栈   展开:清理下面函数的堆栈帧   功能的框架。堆叠框架的清洁涉及很少   复杂:异常处理程序必须找到所有的本地对象   异常和调用时帧上的活动功能   他们的破坏者。

我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

我认为你需要在编译时为SEH异常指定/EHa来调用C ++析构函数。

  

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

有关详细信息,请参阅MSDN