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

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

Destroy


Страницы:   1 2

Faiwer ©   (2010-11-09 16:06:00) 

Доброго времени суток. Меня очередной раз интересует вопрос освобождения памяти, какая то слишком запутанная тема :) Есть класс:

 TPhoto = class
   fname: string; // имя файла
   id: integer; // id_photo в photo
   item: cardinal; // пункт в photolist
   data, mini: TMemoryStream; // фото и миниатюра
   procedure register_item;
 end;


Должен ли я писать:

destructor TPhoto.destroy;
begin
 data.Free;
 mini.Free;
end;


Или класс сам удалит их? А если вместо класса я буду использовать record?

Ещё вопрос из той же оперы:

var
 pd: TList<TPhoto>; // photo data


TPhoto - класс. Если я сделаю pd.clear или pd.free, список сам освободит все pd[i].free?

P.S. D2010, W7


DiamondShark   (2010-11-09 19:47:00) [21]

В третьем тысячелетии не имеют права на существование языки без автоматического управления памятью.


_Юрий   (2010-11-09 18:56:00) [22]


>  Правильно?


правильно. Но не будет ошибкой и руками удалить lab, тогда она перед смертью будет исключена из списков owner'а  и parent'а.


>  А что насчёт TList<T>.clear и TList<T>.free. Нужно ли городить
> что-либо вроде этого:


Можно воспользоваться TObjectList<T>, там это делается автоматически при уничтожении листа (в случае, если не меняли OwnObjects, по умолчанию True)


faiwer   (2010-11-09 18:25:00) [23]


> У них автоматом появляется владелец, который заботится об
> их уничтожении.

Угу. Как раз это я и имел ввиду :)


> Что значит "создаю"? И чего куда там прописывается?


lab:=TLabel.Create(Panel);
lab.parent:=Panel;

Насколько я понимаю, при смерти панели, умрёт и lab, ибо она есть в panel.components[], и панель при уничтожении автоматом перебирает этот массив. Правильно?


DVM   (2010-11-09 18:13:00) [24]


> faiwer ©   (09.11.10 17:34) [7]


> А если я создаю компоненты, я разве должен их удалять? Они
> же прописываются в .components[] или .controls[]

У них автоматом появляется владелец, который заботится об их уничтожении.


Dennis I. Komarov   (2010-11-09 18:09:00) [25]


> А если я создаю компоненты, я разве должен их удалять? Они
> же прописываются в .components[] или .controls[]

Что значит "создаю"? И чего куда там прописывается?


faiwer   (2010-11-09 17:34:00) [26]

[quote]Все то, что создается вручную (create, getmem, new) обязано удалятся в ручную.[/quote]
А если я создаю компоненты, я разве должен их удалять? Они же прописываются в .components[] или .controls[]


> При выходе за пределы области видимости во время исполения
> они будут освобождены без твоего участия.


Ничего не понял :) В каком случае они будут освобождены?


Palladin   (2010-11-09 17:30:00) [27]


> Faiwer ©   (09.11.10 16:06) 

Все то, что создается вручную (create, getmem, new) обязаноудалятся в ручную.
Одному созданию должно соответствовать одно удаление.
В случае динамического масива, строки, variant и интерфейса разрешается полениться и не писать явное освобождение. При выходе за пределы области видимости во время исполения они будут освобождены без твоего участия.

Все эти правила очевидны. Вопрос удивителен.


oldman   (2010-11-09 16:28:00) [28]


> Должен ли я писать:


хуже не будет...


Anatoly Podgoretsky   (2010-11-09 16:15:00) [29]

Надо


Faiwer   (2010-11-09 16:13:00) [30]

Понятно, выходит удалять нужно всегда. А что насчёт TList<T>.clear и TList<T>.free. Нужно ли городить что-либо вроде этого:

var
 i: integer;
begin
 for i:=0 to list.count-1
   do list[i].free;
 list.clear;
end;


Anatoly Podgoretsky   (2010-11-09 16:12:00) [31]

> Faiwer  (09.11.2010 16:06:00)  [0]

Должен


И. Павел   (2010-11-09 16:09:00) [32]

Если ваш класс или запись "содержит" вложенный объект, то это просто ссылка на него, и при удалении удалится только ссылка, а объекты останутся.
Если ваш класс или запись содержит переменную типа структуры, то она удалится, т.к. это именно переменная.


Страницы:   1 2

Наверх

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