![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Destroy
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]Если ваш класс или запись "содержит" вложенный объект, то это просто ссылка на него, и при удалении удалится только ссылка, а объекты останутся.
Если ваш класс или запись содержит переменную типа структуры, то она удалится, т.к. это именно переменная.