【问题标题】:Exception handler doesn't call destructors when catching SEH exception异常处理程序在捕获 SEH 异常时不调用析构函数
【发布时间】:2023-03-17 21:42:01
【问题描述】:
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),它必须执行堆栈 unwinding: 清理下面函数的栈帧 函数的框架。堆栈框架的清理涉及很少 复杂性:异常处理程序必须找到所有本地对象 异常发生时帧上的函数并调用 他们的析构函数。

我错过了什么吗?

【问题讨论】:

    标签: exception seh


    【解决方案1】:

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

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

    更多详情请参阅MSDN

    【讨论】:

    • 我的想法是否正确,如果不存在,编译器只会将析构函数调用插入到异常处理程序主体中?
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 2017-05-02
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2018-05-30
    相关资源
    最近更新 更多