【发布时间】:2021-08-08 14:52:07
【问题描述】:
我正在学习 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 c++ 编译器在内部使用SEH 来支持 c++ 异常。我认为即使在两个选项(/EHa 和/EHsc)出现硬件异常的情况下,它也将允许正确调用对象a1,a2 的析构函数。但是这个例子让我很困惑。事实证明,在硬件异常的情况下,我应该始终使用 /EHa 选项来避免可能的内存泄漏和损坏?但是文档说我应该尽可能使用/EHsc 选项。
【问题讨论】:
-
/EHa是一个非常昂贵的标志,因为它阻止了许多优化,例如消除死存储。任何内存访问都可能导致硬件异常,因此您必须在每次内存访问之前溢出。通常,您应该只编写代码,以免发生硬件异常。 (或者更准确地说,假设任何硬件异常都是致命的。)C++ 语言本身并不要求编译器支持硬件异常的展开。