我正在阅读 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;
}
现在,他在示例之后给出的解释是关于代码如何是异常安全的。
Now, if
new Bitmap
throws an exception, pb (and the Widget it's inside of) remains unchaged)
我不明白。如果构造函数抛出异常将我们引向 UB,我们怎么能在这里谈论不变(因为运算符 delete
不会在 new
运算符返回的指针上被调用,这导致在异常(exception)情况下)?
最佳答案
如果构造函数抛出,operator new
will not keep the memory allocated .这可以防止内存泄漏。
请注意,内存泄漏不会是未定义行为。
关于c++ - 理解构造函数抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30858825/