0

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

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 将最终持有指向已删除 Bitmap 的指针。

这是否意味着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,下一句将删除 Bitmap。那是对的吗?我看不出这些实现之间的区别。

提前致谢。

4

2 回答 2

5

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

不,是的。也许。指针是deleted,您不能依赖它指向或不指向的内容,因此您处于未定义行为的快车道上。

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

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

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

在第一个片段中,如果throws指向pb一个deleted 指针。new在第二个片段中,pb它指向与 if newthrows 相同的有效对象。

于 2015-08-25T12:01:17.430 回答
1

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

于 2015-08-25T11:59:15.823 回答