Re[5]: Кому не лень ковыряться в чужом коде
От: SergH Россия  
Дата: 18.07.02 15:54
Оценка: 2 (1)
Здравствуйте 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 исходного объекта (а это плохо).
Делай что должно, и будь что будет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.