Пройдя через эффективный C++ (автор Scott Meyers), я натолкнулся на следующий код, который автор использует для иллюстрации того, как следует обрабатывать исключения при копировании элементов данных из одного объекта в другой ,Обработка исключений в операторе присваивания копии (C++)
class Bitmap { ... };
class Widget {
...
private:
Bitmap *pb; // ptr to a heap-allocated object
};
Widget& Widget::operator=(const Widget& rhs)
{
Bitmap *pOrig = pb; // remember original pb
pb = new Bitmap(*rhs.pb); // make pb point to a copy of *pb
delete pOrig; // delete the original pb
return *this;
}
В случае, если «новый битмап» выдает исключение, pb останется неизменным. Однако, удалив pOrig, память, на которую были освобождены точки pb. Разве это не опасно? Как это лучше, чем следующий код
Widget& Widget::operator=(const Widget& rhs)
{
if (this == &rhs) return *this; // identity test: if a self-assignment,
// do nothing
delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
}
Which (он утверждает) плохо, потому что, когда «новый Bitmap» дает исключение (либо потому, что не хватает памяти для выделения или потому, что конструктор копирования растрового изображения бросает один) , виджет будет содержать указатель на удаленный битмап
Я проверил ошибки в книге, но не нашел упоминания об этом примере. Мне что-то не хватает? Кроме того, может ли кто-нибудь предложить лучший способ справиться с этим исключением?
Понравилось, спасибо. – Sam