我正在读这本书,我不明白两段代码之间的区别.
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;
}
Run Code Online (Sandbox Code Playgroud)
迈尔斯先生说:
如果"new Bitmap"表达式产生异常,则Widget将最终保持指向已删除Bitmap的指针.
这是否意味着pd指针指向NULL?
Widget& Widget::operator=(const Widget& rhs)
{
Bitmap* temp = pb;
pb = new Bitmap(*rhs.pb);
delete temp;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
迈尔斯先生说:
现在,如果"new Bitmap"抛出异常,pb指针保持不变.
据我所知,临时指针指向与pb指针相同的内存地址.如果"new"抛出异常,pb将指向NULL,下一句将删除Bitmap.那是对的吗?我没有看到这些实现之间的区别.
提前致谢.
这是否意味着pd指针指向NULL?
不,是的.也许.指针已经是deleted,你不能依赖于它指向或未指向的内容,因此你正处于未定义行为的快速轨道上.
据我所知,临时指针指向与pb指针相同的内存地址.如果"new"抛出异常,pb将指向NULL,下一句将删除Bitmap.那是对的吗?
如果new抛出此处,pb将处于之前的状态,并且不会执行下一个表达式.
我没有看到这些实现之间的区别.
在第一片段中,pb指向delete如果d指针new抛出.在第二个片段中,pb指向它new抛出时使用的相同有效对象.