Форум: "Основная";
Текущий архив: 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