Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как правильно уничтожать инстансы ??


Автор: Гость_Игорь 5.8.2004, 09:35
Есть класс типа такого:

Код
TMyClass = class
 Time : TDateTime;
 Depts : TList;
 Something : TSomething;
end;


Надо ли уничтожать внутренние классы
в деструкторе? Что-то типа так:

Код
destructor TMyClass.Destroy;
begin
 Time.Free;
 Depts.Free;
 Something.Free;

 inherited Destroy;
end;


Или же они уничтожаются "автоматом"?

И еще вопрос: необходим ли вызов в деструкторе
Код
inherited Destroy;
??

Заранее спасибо.

Автор: Dynamic 5.8.2004, 10:25
Уничтожать надо, желательно с "обnilиванием" (во избежание возможных ошибок при обращении к объекту). Деструктор тоже надо вызывать, если ты его не переопределяешь полностью.

ИМХО.

Автор: Guest 5.8.2004, 10:35
Ни фига не понял.

Так надо ли в деструкторе вызывать Free для каждого члена класса ?

И что будет если я вообще не объявлю деструктор в своем классе ?
Просто закоментарю его.

Автор: Гость_123 5.8.2004, 10:54
Вызывать надо, только не Фри, а nil(ИМХО)
......................
А будет, очень простая вещь - в памяти может остаца экземпляр класса и при вызове его еще раз могут возникать разные ошибки

Автор: Dynamic 5.8.2004, 11:43
Цитата
Так надо ли в деструкторе вызывать Free для каждого члена класса
Еще раз говорю - НАДО. Все, что создается в конструкторе одного класса, должно быть уничтожено в его же деструкторе. А присвоение nil требуется, чтобы ты мог проверить существование объекта. В твоем случае:
Код
constructor TMyClass.Create();
begin
 inherited;
 if <какое-то условие> then
    Something := TSomething.Create else
    Something := nil;
end;

destructor TMyClass.Destroy;
begin
 if Something <> nil then
 begin
    Something.Free;
    Something := nil;
 end;
inherited;
end;


То же для inherited: ты не знаешь, какие объекты создаются предком твоего класса, соответственно ты должен дать ему возможность самому "почистить" за собой, т.е. вызвать его деструктор.

Автор: Girder 5.8.2004, 12:10
Цитата
Something := nil;
это здесь точно лишнее

Автор: Guest 5.8.2004, 12:34
Спасиба!

Автор: Dynamic 5.8.2004, 12:39
Цитата(Girder @ 5.8.2004, 12:10)
Цитата
Something := nil;
это здесь точно лишнее

Сила привычки smile.gif

Автор: Петрович 5.8.2004, 20:32
Цитата
Сила привычки

Ну тогда уж вместо
Код
x.Free;
x := Nil;

Делай:
Код
FreeAndNil(x);

Проще и красивей smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)