![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;
Не знаю, на сколько это грамотно, но работает без проблем... (: