我正在读这本书,我不明白两段代码之间的区别。
class Bitmap{...};
class Widget
{
...
private:
Bitmap* m_pb;
};
Widget& Widget::operator=(const Widget& rhs)
{
if (this == &rhs)
{
return *this; // if a self-assignment, do nothing
}
delete pb;
pb = new Bitmap(*rhs.m_pb);
return *this;
}
先生。迈尔斯说:
如果“new Bitmap”表达式产生异常,则Widget将会 最后拿着指向已删除位图的指针。
是否意味着 pd 指针指向NULL?
Widget& Widget::operator=(const Widget& rhs)
{
Bitmap* temp = pb;
pb = new Bitmap(*rhs.pb);
delete temp;
return *this;
}
先生。迈尔斯说:
现在,如果“new Bitmap”抛出异常,pb指针仍然存在 不变。
据我所知, temp 指针指向与 pb 指针相同的内存地址。如果“new”抛出异常, pb 将指向NULL,下一句将删除位图。那是对的吗?我没有看到这些实现之间的区别。
提前致谢。
答案 0 :(得分:5)
这是否意味着pd指针指向NULL?
没有。是。也许。指针已经delete
d,你不能依赖它所做或不指向的内容,所以你正在快速定位到未定义的行为。
据我所知,temp指针指向与pb指针相同的内存地址。如果“new”抛出异常,pb将指向NULL,下一句将删除Bitmap。这是对的吗?
如果new
抛出此处,pb
将处于以前的状态,并且不会执行下一个表达式。
我没有看到这些实现之间的区别。
在第一个代码段中,如果pb
抛出,delete
指向new
d指针。
在第二个代码段中,pb
指向new
抛出时所用的相同有效对象。
答案 1 :(得分:1)
您将temp
分配到与pb
相同的内存位置这一事实不会以任何方式影响pb
。在下一行中,如果Bitmap
构造函数将抛出异常,则控件将无法到达赋值部分,因此pb
将保持不变。