Вы найдете на странице 937 из этот документ следующий код:
template<class T> class Safe
{
T* p; // p points to a T allocated using new
public:
Safe() : p(new T) {}
~Safe() { delete p; }
Safe& operator=(const Safe& a) { *p = *a.p; return *this; }
// ...
};
Кажется, что объект, на который указывал p, будет пропущен в операторе присваивания выше.
Нет. Не будет никаких утечек, потому что он не изменил указатель. Конечно, все еще отсутствует конструктор копирования, но кроме этого, нет ошибки.
Это не утечка, потому что он не меняет указатель. Если бы он сделал
Safe& operator=(const Safe& a) { p = a.p; return *this; }
Тогда это будет утечка памяти. Он выполняет присваивание объекту, на который указывает p, а не самому p.
Назначение не проблема: назначаются не указатели, а указатели на значения. Если предположить, T
Назначение безопасное исключение, Safe<T>
Копирование также безопасно. Однако в классе отсутствует конструктор копирования.