了解构造函数引发的异常

Understanding exceptions throwing by a constructor

本文关键字:异常 构造函数 了解      更新时间:2023-10-16

我正在阅读Scott Meyers的有效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(和小部件它是 里面)仍然没有追逐)

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

如果构造函数抛出,operator new 将不会保持分配的内存。这可以防止内存泄漏。

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