Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Free or Destroy   Найти похожие ветки 

 
!Trinix ©   (2005-06-11 07:55) [0]

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

Спасибо.


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

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

_MyClass.Destroy();
_MyClass := nil;

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


 
!Trinix ©   (2005-06-11 08:32) [2]

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


 
cyborg ©   (2005-06-11 09:48) [3]


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

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

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


 
Anatoly Podgoretsky ©   (2005-06-11 10:14) [4]

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


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

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


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

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

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


 
Anatoly Podgoretsky ©   (2005-06-11 20:41) [7]

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


 
Alexander Panov ©   (2005-06-11 20:44) [8]

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.


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

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


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

Sapersky   (11.06.05 22:44) [9]

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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.052 c
14-1118673261
ms1
2005-06-13 18:34
2005.07.11
Moи oтnyck нa Kyбe.


4-1116049971
cheloveck
2005-05-14 09:52
2005.07.11
Прервать выполнение потока (TThread)


6-1110566218
Arazel
2005-03-11 21:36
2005.07.11
Передача файлов удаленна через сокет ВОЗМОЖНО ЛИ ЭТО?


14-1118310091
WondeRu
2005-06-09 13:41
2005.07.11
Посоветуйте ПО для определения утечек памяти


4-1115595703
NikNet
2005-05-09 03:41
2005.07.11
PopupMenu! как сделать для ListView (WinAPI)???