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

时间:2015-08-25 11:54:38

标签: 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;
    }

先生。迈尔斯说:

  

如果“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,下一句将删除位图。那是对的吗?我没有看到这些实现之间的区别。

提前致谢。

2 个答案:

答案 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将保持不变。