【问题标题】:exception thrown in DTOR [duplicate]DTOR中引发的异常[重复]
【发布时间】:2013-02-23 23:12:15
【问题描述】:

我是 C++ 新手,对以下问题有些困惑:

当 DTOR 抛出异常时会发生什么? 对象还在被销毁吗?

提前致谢。

【问题讨论】:

标签: c++ g++


【解决方案1】:

一般来说:这是个坏主意吗?

是的,非常糟糕。

不要从析构函数中抛出异常。如果在引发另一个异常之后又引发了一个异常,但在该异常被 catch 处理程序捕获之前,您的程序将被强制终止。

由于在堆栈展开期间引发异常时会调用析构函数,因此如果其中一个引发另一个异常,则会立即终止您的程序。不好看。

避免从析构函数中抛出异常(或将它们包装到 try/catch 块中,这样您就不会在析构函数之外传播它们)。这样做是一种不好的编程习惯。

来自 C++11 标准的第 15.2/3 段:

为在从 try 块到 抛出异常的点称为“堆栈展开”。如果在堆栈展开期间调用了析构函数 异常退出,调用 std::terminate (15.5.1)。 [ 注意:所以析构函数通常应该捕获 异常,不要让它们传播到析构函数之外。 —尾注]

【讨论】:

    【解决方案2】:

    是的,它是bad idea。没有合理的方法来确定您是否可以安全地投掷。

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多