Разъяснение в отношении утверждения о том, что класс Safe является исключением исключений

Вы найдете на странице 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, будет пропущен в операторе присваивания выше.

1

Решение

Нет. Не будет никаких утечек, потому что он не изменил указатель. Конечно, все еще отсутствует конструктор копирования, но кроме этого, нет ошибки.

3

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

Это не утечка, потому что он не меняет указатель. Если бы он сделал

Safe& operator=(const Safe& a) { p = a.p; return *this; }

Тогда это будет утечка памяти. Он выполняет присваивание объекту, на который указывает p, а не самому p.

4

Назначение не проблема: назначаются не указатели, а указатели на значения. Если предположить, TНазначение безопасное исключение, Safe<T>Копирование также безопасно. Однако в классе отсутствует конструктор копирования.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector