|
Присваивание Ааааа! Эти зловредные пользователи когда-нибудь угомонятся?! 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; } }; Разумеется, если вы вообще не хотите поддерживать присваивание, достаточно объявить оператор = закрытым. |
Copyright 2005. Климов Александр. All Right Reserved.