Здравствуйте Idler, Вы писали:
I>Здравствуйте SergH, Вы писали:
I>template <class T> IList<T> IList<T>::operator = (IList<T> data){
I> delete Items; //Удалить старый список
I> Length = 0;
I> for(int i=0; i<data.Length; i++)
I> Add(data.Items[i]); //Создать новый
I> return *this;
I> }
I>Плсле return *this содержимое data изменяется, видимо для него вызывается деструктор.
Правильная форма operator= выглядит так:
some_class& operator=(const some_class& sc)
{
if (this == &sc)
{
// приравнивание самому себе
return *this;
}
// выполняем присваивание
..
return *this;
}
Обрати внимание на значки
&. Благодаря им ни при передаче sc в operator= ни при возврате значения из operator= копирование не требуется и конструктор копирования не вызывается. И, соответственно, не вызываются деструкторы.
Если конструктор копирования написан корректно (т.е. в твоём случае нужно выделить память, скопировать туда объекты), то отсутствие & приведёт только к низкой производительности, перерасходу памяти, но никаких катастроф не будет (точнее, я не вижу для них повода).
Но если в конструкторе копирования происходит просто почленное копирование (такое будет в конструкторе копирования генерируемом компилятором), то когда вызовется деструктор для sc освободится память, на которую указывает поле Items sc (это нормально) и поле Items исходного объекта (а это плохо).