Главная страница
    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.064 c
1-1118919896
Priest
2005-06-16 15:04
2005.07.11
Как определить по какому столбцу кликнули в cxGridDBTableVi


3-1117428662
yk
2005-05-30 08:51
2005.07.11
Как выбрать из DataSet то что мне нужно


1-1119432901
DelphiN!
2005-06-22 13:35
2005.07.11
Вызов ф-ии в отдельном потоке, с получением результата


5-1088944101
ArMellon
2004-07-04 16:28
2005.07.11
как например к стандартой кнопке прицепить tlabel снизу?


4-1116170119
vaxluk
2005-05-15 19:15
2005.07.11
смена обоев рабочего стола





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский