Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Free or Destroy [Delphi, GLScene, Windows]


!Trinix ©   (2005-06-11 07:55:00) 

Здесь была тема, чем пользоваться Free или Destroy, так я только вчера вспомнил об этом.
Если объект освободить, это не значит, что он удален из ячеек памяти, допустим вы проверяете присутствие патрона в полете:
if FreeForm <> Nil then begin
{} end;
В этом случае, даже если вы сделали FreeForm.Free то объект не будет удален, а после такой инструкции грозится вылет в синию смерть.
Чтобы этого избежать надо использовать:
FreeAndNil(FreeForm);

Спасибо.


Alexander Panov   (2005-06-12 00:47:00) [1]

Sapersky   (11.06.05 22:44) [9]

Для форм вопрос не в переопределении, а в методах освобождения компонентов, принадлежащих форме.

Для форм Borland прямо рекомендует использовать даже не Free, а Release.

И это очень существенное замечание.

Что касается переопределения Free, то такая ситуация вполне возможна. Не стоит использовать напрямую Destroy, вопреки рекомендациям Borland. Вполне может быть, что в некоторых классах, компонентах, это может иметь весьма большое значение.


Sapersky   (2005-06-11 22:44:00) [2]

Может, плохо смотрел, но я не нашёл в VCL (Delphi5) случаев чтобы Free переопределялся (о чём вроде говорилось в [3]). Т.е. он везде работает одинаково, проверяет на nil и вызывает Destroy. Так?
"Принято" относится к тому же - принято переопределять Destroy, а не Free.


Alexander Panov   (2005-06-11 20:44:00) [3]

Sapersky   (11.06.05 20:03) [6]
Вообще-то принято этот код писать в Destroy. Так что единственная разница между Free и Destroy - Free предварительно проверяет на nil.


Ты не прав. Почитай про формы, вообще про компоненты.

"Принято писать" - кем принято?

Для формы(HELP):

Removes the form from memory.

destructor Destroy; override;

Description

Do not call Destroy. Instead, call Release, which indirectly produces a call to the Free method, which in turn calls Destroy.


Anatoly Podgoretsky   (2005-06-11 20:41:00) [4]

q3   (11.06.05 16:21) [5]
Контрольный выстрел?


Sapersky   (2005-06-11 20:03:00) [5]

Освобождать нужно методом Free, так, как там ещё может быть код освобождения дополнительных данных объекта

Вообще-то принято этот код писать в Destroy. Так что единственная разница между Free и Destroy - Free предварительно проверяет на nil.


q3   (2005-06-11 16:21:00) [6]

да-да.
и, кстати, массивчики то же надо сначала
SetLength(Arr, 0);
и ток потом
Arr := nil


Anatoly Podgoretsky   (2005-06-11 10:14:00) [7]

if FreeForm <> Nil then begin
Здесь проверяется не удаление, а равенство указателя nil и ничему более. Необходимость такой проверки говорит о недостатках алгоритма.


cyborg   (2005-06-11 09:48:00) [8]


> Если объект освободить, это не значит, что он удален из
> ячеек памяти

Ошибаешься, он удалён, только указатель на него будет указывать на несуществующий объект, поэтому при освобождении желательно обнулять указатель и при обращении проверять на nil.

Освобождать нужно методом Free, так, как там ещё может быть код освобождения дополнительных данных объекта, после чего в нём вызывается Destroy. Для этого в самописных объектах нежно писать Inherited.


!Trinix   (2005-06-11 08:32:00) [9]

немного экзотично :)


П7   (2005-06-11 07:58:00) [10]

Круто, но это давно всем известно. Но я, например, не пользуюсь этим по религиозным соображениям. Я делю вот так:

_MyClass.Destroy();
_MyClass := nil;

Не знаю, на сколько это грамотно, но работает без проблем... (:


Наверх

Титульная страница Поиск, карта сайта Написать письмо