为什么硬件异常后对象没有被清除



我正在学习c++中的异常模型。下面的例子对我来说显示了有趣的结果

#include <cstdio>
struct A
{
A(int order) : m_order(order){}
~A(){printf("~A(%d)n", m_order);}
int m_order;
};
void foo(void)
{
A a2 = 2;
int i = 0;
int j = 10 / i;
}
void foo1()
{
A a1 = 1;
foo();
}
void main()
{
try
{
foo1();
}
catch (...)
{
}       
}

程序的执行结果实际上取决于异常模型。

对于/EHa,我们有输出:

~A(2)
~A(1)

对于/EHsc,我们什么都没有。

据我所知,msvc++编译器内部使用SEH来支持c++异常。我认为它将允许正确调用对象a1,a2的析构函数,即使在两个选项(/EHa/EHsc(的硬件异常的情况下也是如此。但这个例子让我很困惑。事实证明,在硬件异常的情况下,我应该始终使用/EHa选项来避免可能的内存泄漏和损坏?但医生说我应该尽可能使用/EHsc选项。

/EHa的问题在于,它不能保证捕获所有可能的问题,但它会带来大量开销。/EHsc的效率要高得多,并且仍然捕获每个throw

例如,MSVC++可以使用x87、SSE或AVX指令执行/0.0,并且所产生的硬件异常可能不同。我不知道/EHa什么时候抓到的。

最新更新