![]() |
| ||
|
|
Новости |
Поиск |
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
Плохиш (2010-11-11 12:00:00) [1]
> faiwer © (10.11.10 23:31) [25]
> faiwer © (10.11.10 23:32) [26]
Книжку бы почитал какую, там всё описано. Хотя религиозным любителям сказок читать вредно, пусть верят в чудеса...
Anatoly Podgoretsky (2010-11-11 09:17:00) [2]> Германн (11.11.2010 02:53:29) [29]
У компонента может не быть владельца, а Controls это все видимые компоненты.
Leonid Troyanovsky (2010-11-11 07:25:00) [3]
> Германн © (11.11.10 02:53) [29]
> > Правильно использовать Controls
> Для чего правильно?
Для контрола.
--
Regards, LVT.
Германн (2010-11-11 02:53:00) [4]
> Anatoly Podgoretsky © (10.11.10 23:55) [28]
>
> > clickmaker (10.11.2010 23:39:27) [27]
>
> Правильно использовать Controls
>
Для чего правильно?
Для "произвольного доступа" лучше использовать Components. Оно шире чем Controls.
Anatoly Podgoretsky (2010-11-10 23:55:00) [5]> clickmaker (10.11.2010 23:39:27) [27]
Правильно использовать Controls
clickmaker (2010-11-10 23:39:00) [6]parent - то, на чем лежит. Обычно Form или другой контейнер типа Panel
owner - владелец, ответственный за жизнь и сериализацию свойств компонента, может не быть парентом, н-р Application
в первом контексте для произвольного доступа обычно юзают массив Controls, во втором - Components
faiwer (2010-11-10 23:32:00) [7]либо так:
lab:=TLabel.Create(self); => Components[0] == lab
Не проверял, что конкретно :)
faiwer (2010-11-10 23:31:00) [8]
> Ещё раз спрашиваю, и где здесь автоматом что-то появляется?
lab.parent:=self; => Components[0] == lab
Плохиш (2010-11-10 23:02:00) [9]
> faiwer © (10.11.10 08:37) [22]
Ещё раз спрашиваю, и где здесь автоматом что-то появляется?
faiwer (2010-11-10 08:38:00) [10]Palladin, thx, теперь понял о чём вы :)
faiwer (2010-11-10 08:37:00) [11]
> И где здесь автоматом что-то появляется?
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;
Palladin (2010-11-10 07:31:00) [12]
> > При выходе за пределы области видимости во время исполения
> > они будут освобождены без твоего участия.Ничего не понял
> :) В каком случае они будут освобождены?
procedure proc1;
var
R: Array of Integer;
begin
SetLength(a, 10); // выделили память для 10 integer
end; // конец области видимости для переменной R, память R будет освобождена без твоего участия
Palladin (2010-11-10 07:28:00) [13]И вообще. Слова "владелец", "родитель" могут запутать. На самом деле эти понятия частью языка Delphi не являются, они являются понятиями класса TComponent. Этот класс написан простыми программистами.
Palladin (2010-11-10 07:26:00) [14]
> faiwer © (09.11.10 18:25) [10]
> > У них автоматом появляется владелец, который заботится
> об > их уничтожении.Угу. Как раз это я и имел ввиду :)
Система компонентов это простая как три рубля система контейнеров, которые заботятся о уничтожении своего содержимого. Все. К низкому уровню работы, коий ты продемострировал в вопросе, контейнеры не относятся.
Плохиш (2010-11-09 23:57:00) [15]
> lab:=TLabel.Create(Panel);
> lab.parent:=Panel;
>
И где здесь автоматом что-то появляется?
Плохиш (2010-11-09 23:53:00) [16]
> DVM © (09.11.10 18:13) [9]
> > А если я создаю компоненты, я разве должен их удалять?
> Они
> > же прописываются в .components[] или .controls[]
>
> У них автоматом появляется владелец, который заботится об
> их уничтожении.
Чё, здесь Калашников со своим автоматом тоже отметился? С какой это стати у них автоматом что-то появляется?
DiamondShark (2010-11-09 21:03:00) [17]
> Andy BitOff © (09.11.10 20:26) [14]
> Давайте еще и здесь похоливарим =)))
А мне показалось, что это раздел "Прочее" %(
Всё, переработал. Пора домой.
И да, мы не холиварим, мы концептуалим.
DiamondShark (2010-11-09 20:58:00) [18]
> И. Павел © (09.11.10 20:22) [13]
> Даже assembler?
Вопрос не имеет смысла: в языке ассемблера отсутствуют сущности, над которыми определены операции создания/уничтожения.
> Или все же только на очень высоком уровне
Человек всегда мыслит только на высоком уровне.
Низкоуровневые языки не для крутости, а от бедности. Когда в 50-х годах прошлого века машинное время было дороже зарплаты программиста, а 100К слов было объёмом памяти суперкомпьютера -- низкий уровень был оправдан.
и если не требуется быстрых вычислений?
Эффективные алгоритмы человеку легче придумывать на высоком уровне.
А с качественным переводом на машинный язык лучше справляется компьютер. Компилятор с глубокой оптимизацией в общем случае выдаст более быстрый код, чем человек способен вручную написать на ассемблере.
Andy BitOff (2010-11-09 20:26:00) [19]Давайте еще и здесь похоливарим =)))
И. Павел (2010-11-09 20:22:00) [20]
> В третьем тысячелетии не имеют права на существование языки
> без автоматического управления памятью.
Даже assembler?
Или все же только на очень высоком уровне, и если не требуется быстрых вычислений?