【发布时间】:2013-02-23 23:12:15
【问题描述】:
我是 C++ 新手,对以下问题有些困惑:
当 DTOR 抛出异常时会发生什么? 对象还在被销毁吗?
提前致谢。
【问题讨论】:
-
这里已经讨论了100500次,使用搜索
-
我编辑了它——只留下关于对象是否被销毁的问题
我是 C++ 新手,对以下问题有些困惑:
当 DTOR 抛出异常时会发生什么? 对象还在被销毁吗?
提前致谢。
【问题讨论】:
一般来说:这是个坏主意吗?
是的,非常糟糕。
不要从析构函数中抛出异常。如果在引发另一个异常之后又引发了一个异常,但在该异常被 catch 处理程序捕获之前,您的程序将被强制终止。
由于在堆栈展开期间引发异常时会调用析构函数,因此如果其中一个引发另一个异常,则会立即终止您的程序。不好看。
避免从析构函数中抛出异常(或将它们包装到 try/catch 块中,这样您就不会在析构函数之外传播它们)。这样做是一种不好的编程习惯。
来自 C++11 标准的第 15.2/3 段:
为在从 try 块到 抛出异常的点称为“堆栈展开”。如果在堆栈展开期间调用了析构函数 异常退出,调用 std::terminate (15.5.1)。 [ 注意:所以析构函数通常应该捕获 异常,不要让它们传播到析构函数之外。 —尾注]
【讨论】:
是的,它是bad idea。没有合理的方法来确定您是否可以安全地投掷。
【讨论】: