Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.039 c
14-1118605421
Просто Джо
2005-06-12 23:43
2005.07.11
Обработка file upload в PHP


1-1118394983
Lenik
2005-06-10 13:16
2005.07.11
Как считать новое значение из DateTimePicker


3-1117000070
Гость2
2005-05-25 09:47
2005.07.11
Как вставить переменную в SQL-запрос?


6-1111403921
Sour Smile
2005-03-21 14:18
2005.07.11
Как работать с реестром на удалённой машине?


3-1117645602
Shuric
2005-06-01 21:06
2005.07.11
Oracle через ODBC





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский