我正在阅读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>
答案 0 :(得分:2)
如果构造函数抛出,operator new
will not keep the memory allocated。这可以防止内存泄漏。
请注意,内存泄漏不是未定义行为。