有效的C++ Item 11处理对self的赋值

J.P*_*.PG 0 c++ effective-c++

我正在读这本书,我不明白两段代码之间的区别.

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.那是对的吗?我没有看到这些实现之间的区别.

提前致谢.

Tar*_*ama 5

这是否意味着pd指针指向NULL?

不,是的.也许.指针已经是deleted,你不能依赖于它指向或未指向的内容,因此你正处于未定义行为的快速轨道上.

据我所知,临时指针指向与pb指针相同的内存地址.如果"new"抛出异常,pb将指向NULL,下一句将删除Bitmap.那是对的吗?

如果new抛出此处,pb将处于之前的状态,并且不会执行下一个表达式.

我没有看到这些实现之间的区别.

在第一片段中,pb指向delete如果d指针new抛出.在第二个片段中,pb指向它new抛出时使用的相同有效对象.