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

Вниз

Еще немного про метод 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.012 c
1-65542
Vadim S
2003-10-07 14:03
2003.10.20
Как замерить микросекунды?


3-65391
xGhost
2003-09-27 13:47
2003.10.20
Обязательно ли устанавливать BDE ? Есть ли другой путь ?


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


3-65370
Dark Elf
2003-09-25 16:10
2003.10.20
Пароль и логин в TADOConnection


14-65601
olookin
2003-09-30 08:32
2003.10.20
Похмелье и его влияние на личность





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