Форум: "Начинающим";
Текущий архив: 2011.01.30;
Скачать: [xml.tar.bz2];
ВнизDestroy Найти похожие ветки
← →
Faiwer © (2010-11-09 16:06) [0]Доброго времени суток. Меня очередной раз интересует вопрос освобождения памяти, какая то слишком запутанная тема :) Есть класс:
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
← →
И. Павел © (2010-11-09 16:09) [1]Если ваш класс или запись "содержит" вложенный объект, то это просто ссылка на него, и при удалении удалится только ссылка, а объекты останутся.
Если ваш класс или запись содержит переменную типа структуры, то она удалится, т.к. это именно переменная.
← →
Anatoly Podgoretsky © (2010-11-09 16:12) [2]> Faiwer (09.11.2010 16:06:00) [0]
Должен
← →
Faiwer © (2010-11-09 16:13) [3]Понятно, выходит удалять нужно всегда. А что насчёт 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:15) [4]Надо
← →
oldman © (2010-11-09 16:28) [5]
> Должен ли я писать:
хуже не будет...
← →
Palladin © (2010-11-09 17:30) [6]
> Faiwer © (09.11.10 16:06)
Все то, что создается вручную (create, getmem, new) обязано удалятся в ручную.
Одному созданию должно соответствовать одно удаление.
В случае динамического масива, строки, variant и интерфейса разрешается полениться и не писать явное освобождение. При выходе за пределы области видимости во время исполения они будут освобождены без твоего участия.
Все эти правила очевидны. Вопрос удивителен.
← →
faiwer © (2010-11-09 17:34) [7][quote]Все то, что создается вручную (create, getmem, new) обязано удалятся в ручную.[/quote]
А если я создаю компоненты, я разве должен их удалять? Они же прописываются в .components[] или .controls[]
> При выходе за пределы области видимости во время исполения
> они будут освобождены без твоего участия.
Ничего не понял :) В каком случае они будут освобождены?
← →
Dennis I. Komarov © (2010-11-09 18:09) [8]
> А если я создаю компоненты, я разве должен их удалять? Они
> же прописываются в .components[] или .controls[]
Что значит "создаю"? И чего куда там прописывается?
← →
DVM © (2010-11-09 18:13) [9]
> faiwer © (09.11.10 17:34) [7]
> А если я создаю компоненты, я разве должен их удалять? Они
> же прописываются в .components[] или .controls[]
У них автоматом появляется владелец, который заботится об их уничтожении.
← →
faiwer © (2010-11-09 18:25) [10]
> У них автоматом появляется владелец, который заботится об
> их уничтожении.
Угу. Как раз это я и имел ввиду :)
> Что значит "создаю"? И чего куда там прописывается?
lab:=TLabel.Create(Panel);
lab.parent:=Panel;
Насколько я понимаю, при смерти панели, умрёт и lab, ибо она есть в panel.components[], и панель при уничтожении автоматом перебирает этот массив. Правильно?
← →
_Юрий (2010-11-09 18:56) [11]
> Правильно?
правильно. Но не будет ошибкой и руками удалить lab, тогда она перед смертью будет исключена из списков owner"а и parent"а.
> А что насчёт TList<T>.clear и TList<T>.free. Нужно ли городить
> что-либо вроде этого:
Можно воспользоваться TObjectList<T>, там это делается автоматически при уничтожении листа (в случае, если не меняли OwnObjects, по умолчанию True)
← →
DiamondShark © (2010-11-09 19:47) [12]В третьем тысячелетии не имеют права на существование языки без автоматического управления памятью.
← →
И. Павел © (2010-11-09 20:22) [13]
> В третьем тысячелетии не имеют права на существование языки
> без автоматического управления памятью.
Даже assembler?
Или все же только на очень высоком уровне, и если не требуется быстрых вычислений?
← →
Andy BitOff © (2010-11-09 20:26) [14]Давайте еще и здесь похоливарим =)))
← →
DiamondShark © (2010-11-09 20:58) [15]
> И. Павел © (09.11.10 20:22) [13]
> Даже assembler?
Вопрос не имеет смысла: в языке ассемблера отсутствуют сущности, над которыми определены операции создания/уничтожения.
> Или все же только на очень высоком уровне
Человек всегда мыслит только на высоком уровне.
Низкоуровневые языки не для крутости, а от бедности. Когда в 50-х годах прошлого века машинное время было дороже зарплаты программиста, а 100К слов было объёмом памяти суперкомпьютера -- низкий уровень был оправдан.
и если не требуется быстрых вычислений?
Эффективные алгоритмы человеку легче придумывать на высоком уровне.
А с качественным переводом на машинный язык лучше справляется компьютер. Компилятор с глубокой оптимизацией в общем случае выдаст более быстрый код, чем человек способен вручную написать на ассемблере.
← →
DiamondShark © (2010-11-09 21:03) [16]
> Andy BitOff © (09.11.10 20:26) [14]
> Давайте еще и здесь похоливарим =)))
А мне показалось, что это раздел "Прочее" %(
Всё, переработал. Пора домой.
И да, мы не холиварим, мы концептуалим.
← →
Плохиш © (2010-11-09 23:53) [17]
> DVM © (09.11.10 18:13) [9]
> > А если я создаю компоненты, я разве должен их удалять?
> Они
> > же прописываются в .components[] или .controls[]
>
> У них автоматом появляется владелец, который заботится об
> их уничтожении.
Чё, здесь Калашников со своим автоматом тоже отметился? С какой это стати у них автоматом что-то появляется?
← →
Плохиш © (2010-11-09 23:57) [18]
> lab:=TLabel.Create(Panel);
> lab.parent:=Panel;
>
И где здесь автоматом что-то появляется?
← →
Palladin © (2010-11-10 07:26) [19]
> faiwer © (09.11.10 18:25) [10]
> > У них автоматом появляется владелец, который заботится
> об > их уничтожении.Угу. Как раз это я и имел ввиду :)
Система компонентов это простая как три рубля система контейнеров, которые заботятся о уничтожении своего содержимого. Все. К низкому уровню работы, коий ты продемострировал в вопросе, контейнеры не относятся.
← →
Palladin © (2010-11-10 07:28) [20]И вообще. Слова "владелец", "родитель" могут запутать. На самом деле эти понятия частью языка Delphi не являются, они являются понятиями класса TComponent. Этот класс написан простыми программистами.
← →
Palladin © (2010-11-10 07:31) [21]
> > При выходе за пределы области видимости во время исполения
> > они будут освобождены без твоего участия.Ничего не понял
> :) В каком случае они будут освобождены?procedure proc1;
var
R: Array of Integer;
begin
SetLength(a, 10); // выделили память для 10 integer
end; // конец области видимости для переменной R, память R будет освобождена без твоего участия
← →
faiwer © (2010-11-10 08:37) [22]
> И где здесь автоматом что-то появляется?procedure TMainForm.FormCreate(Sender: TObject);
var
lab: TLabel;
begin
lab:=TLabel.Create(self);
lab.parent:=self;
lab.Caption:="test";
ShowMessage(TLabel(Components[0]).Caption);
end;
← →
faiwer © (2010-11-10 08:38) [23]Palladin, thx, теперь понял о чём вы :)
← →
Плохиш © (2010-11-10 23:02) [24]
> faiwer © (10.11.10 08:37) [22]
Ещё раз спрашиваю, и где здесь автоматом что-то появляется?
← →
faiwer © (2010-11-10 23:31) [25]
> Ещё раз спрашиваю, и где здесь автоматом что-то появляется?
lab.parent:=self; => Components[0] == lab
← →
faiwer © (2010-11-10 23:32) [26]либо так:
lab:=TLabel.Create(self); => Components[0] == lab
Не проверял, что конкретно :)
← →
clickmaker © (2010-11-10 23:39) [27]parent - то, на чем лежит. Обычно Form или другой контейнер типа Panel
owner - владелец, ответственный за жизнь и сериализацию свойств компонента, может не быть парентом, н-р Application
в первом контексте для произвольного доступа обычно юзают массив Controls, во втором - Components
← →
Anatoly Podgoretsky © (2010-11-10 23:55) [28]> clickmaker (10.11.2010 23:39:27) [27]
Правильно использовать Controls
← →
Германн © (2010-11-11 02:53) [29]
> Anatoly Podgoretsky © (10.11.10 23:55) [28]
>
> > clickmaker (10.11.2010 23:39:27) [27]
>
> Правильно использовать Controls
>
Для чего правильно?
Для "произвольного доступа" лучше использовать Components. Оно шире чем Controls.
← →
Leonid Troyanovsky © (2010-11-11 07:25) [30]
> Германн © (11.11.10 02:53) [29]
> > Правильно использовать Controls
> Для чего правильно?
Для контрола.
--
Regards, LVT.
← →
Anatoly Podgoretsky © (2010-11-11 09:17) [31]> Германн (11.11.2010 02:53:29) [29]
У компонента может не быть владельца, а Controls это все видимые компоненты.
← →
Плохиш © (2010-11-11 12:00) [32]
> faiwer © (10.11.10 23:31) [25]
> faiwer © (10.11.10 23:32) [26]
Книжку бы почитал какую, там всё описано. Хотя религиозным любителям сказок читать вредно, пусть верят в чудеса...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.01.30;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.004 c