Visual C++有一个编译器设置"启用C++异常",可以设置为"否"。如果我这样设置会发生什么?我的代码从未显式地抛出或捕获异常(因此第一个抛出的异常将无论如何终止程序),也不依赖于堆栈展开 - 我应该期望重新编译后的程序有任何不希望的行为吗?
MSDN文档中有这个选项的解释,它解释了不同的异常模式,并给出了代码示例以展示不同模式之间的区别。此外,这篇文章也可能很有趣尽管它比较老。
简而言之: 此选项基本上启用或禁用跟踪所有对象的生命周期。这种跟踪是必需的,因为在发生异常时,需要调用所有正确的析构函数、展开栈并执行大量的清理工作。这种跟踪需要组织开销(即额外的代码),可以通过将选项设置为“否”来删除该开销。
我自己没有尝试过,但如果将选项设置为“否”,看起来仍然可以throw
和catch
异常,但是缺少清理和展开,这可能会产生非常糟糕的后果(不建议使用;) ..
class Test
{
public:
Test()
{
printf("Test::constructor");
}
~Test()
{
printf("Test::Destructor");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
int a;
try
{
Test a;
int* p = 0;
*p = 0; // Cause access violation
}
catch (...)
{
printf("Caught access violation");
}
return 0;
}
如果不进行异常处理,输出结果将会是:
Test::constructor
Caught access violation
我曾经处理的代码总是关闭异常。我没有看到过损坏或资源浪费的问题。
我认为,在C++中,异常通常不太适合。由于缺乏GC,堆栈爆炸使整个异常处理变得非常麻烦。此外,还有一个关于“异常”真正意义的争论,与可能的失败相比较。
operator new
无法分配内存,我相信它会返回NULL
而不是抛出std::bad_alloc
异常。
__cpp_exceptions
? - user2023370