【发布时间】: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