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

Вниз

Еще немного про метод free и выход из процедуры   Найти похожие ветки 

 
Islander   (2003-10-07 20:43) [0]

Говорят, что, если объект объявлен в функции или процедуре, то метод Free к нему применяется автоматически при выходе из процедуры. Так ли это? И сработает ли для следуещего примера?
Все ли объекты будут уничтожены?

Procedure lalala;
var
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Strings: TStrings;
begin

Label1:= TLabel.create (nil);
Label2:= TLabel.create (self);
Label3:= TLabel.create (Form1);
Strings:= TStringList.create;
end;


 
Fay   (2003-10-07 20:46) [1]

Ни один


 
Islander   (2003-10-07 20:50) [2]

Вы уверены?!
А как это проверить?


 
Anatoly Podgoretsky ©   (2003-10-07 20:52) [3]

Это не надо проверять, иначе бы Дельфи не работала.


 
DiamondShark ©   (2003-10-07 21:06) [4]


> А как это проверить?

Брекпоинт в деструкторе поставить...


 
Fay   (2003-10-07 21:10) [5]

Это (как правило) не проверяют - из этого исходят.


 
Islander   (2003-10-07 21:19) [6]

Так значит, все-таки делать free?


 
DiamondShark ©   (2003-10-07 21:22) [7]


> Так значит, все-таки делать free?

Как это ни печально -- да.


 
Семен Сорокин ©   (2003-10-07 21:28) [8]

2Islander
Вариант для функции:
MyObject := TMyObject.Create;
try
...
finally
MyObject.Free
end;


Вариант для объекта внутри другого:

constructor TMyClass.Create...
begin
MyObject := TMyObject.Create;
end;

destructor TMyClass.Destroy;
begin
MyObject.Free
end;


Вариант для модуля:

...

initialization
MyObject := TMyObject.Create;

finalization
MyObject.Free

end.


 
Anatoly Podgoretsky ©   (2003-10-07 21:31) [9]

Если проанализивовать, то

Procedure lalala;
Label1:= TLabel.create (nil); // этот удалять
Label2:= TLabel.create (self); // ошибка компиляции
Label3:= TLabel.create (Form1); // этот необязательно
Strings:= TStringList.create; // этот удалять
end;


 
Ihor Osov'yak ©   (2003-10-08 00:41) [10]

2 Islander (07.10.03 20:43)

в делфи нет механизма сборки мусора и неявно вызываемых деструкторов при выходе из области видимости.. Есть некоторые структуры со счетчиком использований, которые автоматически уничножаются, при сбрасывании счетчика в нуль (те же строки (не короткие), те же обьекты, удерживаемые по интерфейсной ссылке) - .. Но это не совсем то, что неявно вызываемые деструкторы в том же си.. Поэтому см. [9] Anatoly Podgoretsky © (07.10.03 21:31)


 
kaif ©   (2003-10-08 00:51) [11]

Потомки класса TConponent имеют в виртуальном конструкторе параметр create(AOwner: TComponent). Так вот, если AOwner не был nil, то такой компонент будет уничтожен при уничтожении компонента, который был передан, как AOwner. Но это хороший способ, если предполагается создавать компонент однократно. А иначе, эти компоненты, хоть и уничтожатся когда-нибудь, но если их много, могут отнимать все больше и больше ресурсов в процессе работы программы. Поэтому самый правильный и надежный способ, применимый ко всем таким товарищам, это уничтожать, если болше не используется, желательно в блоке защищенных ресурсов try-finally-end.
Я обычно даже все формы, кроме главной, создаю по мере надобности и уничтожаю, а не перечисляю в dpr, как это по умолчанию принято делать.
Но вот что касается COM-объектов, то насколько я помню, Delphi сама подсчитывает ссылки и удаляет их. Но боюсь ошибиться...


 
Ihor Osov'yak ©   (2003-10-08 01:07) [12]

> COM-объектов, то насколько я помню, Delphi сама подсчитывает ссылки

Это не делфи делает, это требования кома, которые разработчики com-обьетов должны выполнить.. Компилятор делфи только автоматически генерирует визовы
_AddRef и _Release при работе с интерфейчными ссылками..

Зы - приходилось несколько раз наблюдать за сишными програмерами, пересевшими на делфи, и работающими с COM - и ихними вызовами _AddRef и _Release с подальшим поиском лишнего или недостающего _Release :-)


 
kaif ©   (2003-10-08 01:36) [13]

2 Ihor Osov"yak © (08.10.03 01:07) [12]
Точно! Delphi сама _AddRef и _Release тихаря юзает. Типа избавляет разработчика от головной боли.



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

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

Наверх




Память: 0.5 MB
Время: 0.015 c
3-65392
griser
2003-09-26 17:29
2003.10.20
DCOM


3-65351
konst
2003-09-29 12:29
2003.10.20
сортировка Query


1-65508
Raduga
2003-10-09 12:56
2003.10.20
Свойство типа TComponent


9-65310
Хранитель_7К
2003-04-14 14:56
2003.10.20
Опять про нормали / / /


4-65673
uncle
2003-08-16 02:11
2003.10.20
Обработка сообщений формы из её компонента.