Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

объекты и память


freeman82 ©   (2004-11-11 12:07:00) 

В программе создаются несколько объектов
procedure TForm1.Button1Click(Sender: TObject);
var
 obj:TMyObject;
begin
 obj:=TMyObject.create;
 obj.property1:='';
end;
Если я при закрытии программы напишу
obj.free;
то освободится ли память выделенная под все объекты данного класса?


icWasya   (2004-11-11 16:05:00) [1]

>freeman82   (11.11.04 12:33) [4]
>как при закрытии программы удалить память выделенную под все объекты.

У TreeView есть событие OnDeletion
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
 TObject(Node.Data).Free;
end;


Digitman   (2004-11-11 15:53:00) [2]


> KSergey ©   (11.11.04 15:33) [14]



> не боитесь ли


мне, знаете ли, фиолетово.

ну пр евратно истолкует человек, ну споткнется, ну набъет лишнюю шишку - это проблемы невнимательного чтения им материала дискуссии.

а если и набил, то и здесь ничего страшного - вовремя и самостоятельносделанные выводы навсегдаосядут в памяти.


KSergey   (2004-11-11 15:33:00) [3]

> [8] Digitman ©   (11.11.04 13:11)

Формально, с учетом наличия слов "при закрытии программы" ответ, конечно, верный, но не боитесь ли, уважаемый, что он будет привратно истолкован? ;) В том числе распространен на случаи с отсутствующими словами "при закрытии программы"?


begin...end   (2004-11-11 13:44:00) [4]

panov ©   (11.11.04 13:27) [11]
Digitman ©   (11.11.04 13:40) [12]

Спасибо.


Digitman   (2004-11-11 13:40:00) [5]


> begin...end ©   (11.11.04 13:21) [10]
> Кстати, а с динамическими массивами - также?


а какая разница - "динамический" массив или какой-то иной ?
с т.з. ресурсов ОС - абсолютно никакой разницы.


panov   (2004-11-11 13:27:00) [6]

>begin...end ©   (11.11.04 13:21) [10]
При завершении процесса всересурсы освобождаются...


begin...end   (2004-11-11 13:21:00) [7]

Digitman ©   (11.11.04 13:11) [8]

Кстати, а с динамическими массивами - также?
Т.е. они тоже автоматически освободятся при закрытии?


freeman82   (2004-11-11 13:19:00) [8]

Спасибо за ответы


Digitman   (2004-11-11 13:11:00) [9]


> freeman82   (11.11.04 13:03) [7]


в соответствии с документацией Майкрософт - не будет.


freeman82   (2004-11-11 13:03:00) [10]

>Digitman
т.е. если я делаю так
var
 obj:TMyObject;
begin
 obj:=TMyObject.create;
 obj.property1:='';
 TreeView1.Items.AddChildObject(Node,obj.property1,obj);

то при закрытии программы не будет утечки памяти?


Digitman   (2004-11-11 12:44:00) [11]


> freeman82   (11.11.04 12:33) [4]
> как при закрытии программы удалить память выделенную под
> все объекты.


именно при закрытии ты вправе вообще об этом не беспокоиться.


panov   (2004-11-11 12:42:00) [12]

>freeman82   (11.11.04 12:33) [4]

Пройтись в цикле по всему дереву и освободить память, выделенную под объекты.


freeman82   (2004-11-11 12:33:00) [13]

а как решить такую задачу,есть дерево treeview,в каждом узле дерева я хочу хранить указатель на объект,
node.data:=obj;
как при закрытии программы удалить память выделенную под все объекты.


Gloomer   (2004-11-11 12:31:00) [14]

а может переменную obj стоит объявить глобально и создавать TMyObject.create только один раз в FormCreate?
И как при закрытии программы у тебя будет присутствовать obj, если она определена локально в ButtonClick?


Семен Сорокин   (2004-11-11 12:19:00) [15]

procedure TForm1.Button1Click(Sender: TObject);
var
obj:TMyObject;
begin
obj:=TMyObject.create;
obj.property1:='';
end;


здесь явная утечка памяти...
каждому вызову Create должен соответствовать вызов Free


REA   (2004-11-11 12:15:00) [16]

Нет, если присваивать все объекты одной переменной obj.


Наверх

Титульная страница Поиск, карта сайта Написать письмо