有效的c++项目11处理对self的赋值

Effective C++ Item 11 handle assignment to self

本文关键字:self 赋值 处理 c++ 项目 有效      更新时间:2023-10-16

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

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,下一个句子将删除位图。对吗?我看不出这些实现之间有什么区别。

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

。是的。也许吧。指针已经是delete d,你不能依赖它做什么或不指向,所以你在快速通道上未定义的行为。

据我所知,temp指针指向与pb指针相同的内存地址。如果"new"抛出异常,pb将指向NULL,下一个句子将删除位图。对吗?

如果new在这里抛出,pb将处于与之前相同的状态,并且下一个表达式将不会被执行。

我看不出这些实现之间的区别。

在第一个代码片段中,如果new抛出,pb指向 deleted指针。在第二个代码片段中,pb指向与new抛出时相同的有效对象。

temp分配给与pb相同的内存位置这一事实不会以任何方式影响pb。在下一行中,如果Bitmap构造函数抛出异常,则控制将无法到达赋值部分,因此pb将保持不变。