了解构造函数抛出的异常

时间:2015-06-16 04:30:02

标签: c++ exception constructor

我正在阅读Scott Meyers的 Effective C ++ ,他提供了一个精心设计的assignement运算符的例子。这是:

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,那么我们怎么能谈论在这里不变(因为delete运算符返回的指针不会调用operator new而导致异常??< / p>

1 个答案:

答案 0 :(得分:2)

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

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