Материалы книги получены с http://www.itlibitum.ru/
Присваивание
Ааааа! Эти зловредные пользователи когда-нибудь угомонятся?!
MP<Foo> mpf1;
MP<Foo> mpf2;
mpf2 = mpf1; // Нет, только не это...
В приведенном фрагменте возникают сразу две проблемы. Во-первых, указываемый объект, созданный конструктором mpf2, никогда не удаляется. Он превращается в Летучего Голландца, обреченного на вечные скитания в океане памяти. Во-вторых, оператор =, используемый компилятором по умолчанию, копирует адрес, находящийся в t, из одного указателя в другой, что приводит к появлению двух ведущих указателей, ссылающихся на один объект. В исправленном варианте перегруженный оператор
= удаляет объект, на который ссылается левосторонний указатель, и заменяет его копией объекта, на который ссылается правосторонний указатель.
template <class Type>
class MP {
private:
Type* t;
public:
MP(); // Нормальный конструктор
MP<Type>& operator=(const MP<Type>& mp)
{
if (&mp != this) {
delete t;
t = new Type(*(mp.t));
}
return *this;
}
};
Разумеется, если вы вообще не хотите поддерживать присваивание, достаточно объявить оператор = закрытым.
Назад Содержание Далее
|