嗨,我在网络教程中找到了这一行.
当声明一个静态对象并且析构函数抛出异常时会发生什么?
与静态构造函数异常一样,应用程序将崩溃.
如果对象是静态的,我无法理解有什么区别......
谢谢
我不确定您是否在询问抛出异常的构造函数或析构函数 - 问题陈述引用了析构函数,但示例代码和一些注释引用了构造函数。
对于抛出异常的构造函数,取决于静态对象是局部的还是全局的。本地静态对象是在控制权首次通过定义它们的范围时构造的,并且异常处理程序应该对它们正常运行。全局静态对象在程序进入之前构造main();由于您不能在全局范围内使用 try-catch 块,因此如果全局静态对象的构造函数抛出异常,则基本上意味着您的应用程序在走出起始门之前就崩溃了。
至于析构函数,一般来说,可以抛出异常的析构函数会产生严重的问题。Herb Sutter 在他的伟大著作《Exceptional C++》中详细介绍了原因,该书可在Google 图书上找到。基本上,如果析构函数可以抛出异常,则几乎不可能编写异常安全的代码。考虑以下示例。
class T
{
T() {}
~T() { throw 5; }
};
void foo()
{
T t;
throw 10;
}
Run Code Online (Sandbox Code Playgroud)
当foo()到达该throw 10;语句时,控制将退出 的上下文,销毁进程中的foo()本地对象。t这会调用 的析构函数t,它会尝试抛出另一个异常。在 C++ 中,不可能同时抛出两个异常;如果像这样抛出第二个异常,程序将调用内置函数terminate(),它会执行听起来的操作并终止程序(您可以设置要调用的自己的函数,而不是使用set_terminate,但这主要是为了执行自定义清理- up - 你无法改变程序在函数完成后结束的事实)。
避免这种情况的方法是确保析构函数永远不会抛出异常。对于静态对象来说这可能并不重要,因为正如 celtschk 所指出的,直到程序终止之前析构函数都不会被调用,但作为一般规则,如果您发现自己编写的类具有可能引发异常的析构函数,那么您应该仔细思考这是否真的是最好的方法。
| 归档时间: |
|
| 查看次数: |
1245 次 |
| 最近记录: |