Эффективный C ++ Item 11 обрабатывает присвоение себя

Я читаю эту книгу и не понимаю разницы между двумя частями кода.

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» выдает исключение, виджет будет
в конечном итоге удерживая указатель на удаленное растровое изображение.

Значит ли это, что П.Д. указатель указывает на NULL?

Widget& Widget::operator=(const Widget& rhs)
{
Bitmap* temp = pb;
pb = new Bitmap(*rhs.pb);
delete temp;
return *this;
}

Мистер Мейерс говорит:

Теперь, если «new Bitmap» выдает исключение, указатель pb остается
без изменений.

Насколько я знаю, температура указатель указывает на тот же адрес памяти, что и пб указатель. Если «новый» выдает исключение, пб будет указывать на NULL, а следующее предложение удалит растровое изображение. Это верно? Я не вижу разницы между этими реализациями.

Заранее спасибо.

0

Решение

Означает ли это, что указатель pd указывает на NULL?

Нет да. Может быть. Указатель был deleted, вы не можете полагаться на то, что он делает или на что не указывает, так что вы на пути к неопределенному поведению.

Насколько я знаю, временный указатель указывает на тот же адрес памяти, что и указатель pb. Если «new» выдает исключение, pb укажет на NULL, а следующее предложение удалит растровое изображение. Это верно?

Если new бросает здесь, pb будет в том же состоянии, что и раньше, и следующее выражение не будет выполнено.

Я не вижу разницы между этими реализациями.

В первом фрагменте, pb указывает на deleteуказатель d, если new броски.
Во втором фрагменте, pb указывает на тот же действительный объект, который он использовал, если new броски.

5

Другие решения

Тот факт, что вы назначаете temp в ту же область памяти, что и pb не влияет pb любым способом. В следующей строке, если Bitmap конструктор выдаст исключение, элемент управления не достигнет части назначения, таким образом pb останется без изменений.

1

По вопросам рекламы [email protected]