【问题标题】:Understanding exceptions throwing by a constructor理解构造函数抛出的异常
【发布时间】:2015-06-16 04:30:02
【问题描述】:

我正在阅读 Scott Meyers 的 Effective C++,他提供了一个设计良好的赋值运算符的示例。这里是:

class Bitmap{ ... };
class Widget
{
    //...
private:
    Bitmap *pb;
};

Widget::operator=(const Widget& rhs)
{
    Bitmap *pOrig = pb;
    pb = new Bitmap(*rhs.pb);
    delete pOrig;
    return *this;
}

现在,他在示例之后给出的解释是关于代码如何是异常安全的。

现在,如果new Bitmap 抛出异常, pb (以及它的 Widget 内部)保持不变)

我不明白。如果构造函数抛出异常导致我们进入 UB,我们怎么能在这里谈论不变(因为 new 运算符返回的指针不会调用运算符 delete 导致异常)?

【问题讨论】:

  • 允许构造函数抛出异常,这不会导致 UB。不知道你在最后一段中得到了什么。当抛出异常时,执行跳转到异常的catch处理程序,它不会继续到delete pOrig;
  • @MattMcNabb 如您所见,示例中没有任何 cathc 子句。所以,程序将被终止....
  • @St.Antario:你怎么知道没有捕获?该示例不是一个完整的程序。
  • @BenjaminLindley 好吧,operator= 定义中没有任何问题。这还不够吗?
  • 如果操作符在内部捕获到异常,调用者无法判断赋值是否成功。这就是为什么故意不处理它的原因。

标签: c++ exception constructor


【解决方案1】:

如果构造函数抛出,operator new will not keep the memory allocated。这可以防止内存泄漏。

请注意,内存泄漏不会是未定义行为。

【讨论】:

  • 请注意,内存泄漏不会是未定义的行为。不清楚。我以为内存泄漏是UB。
猜你喜欢
  • 2011-11-04
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 2011-10-10
  • 2017-11-07
  • 2019-03-11
  • 2019-07-11
  • 2013-03-25
相关资源
最近更新 更多