Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.30;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.008 c
11-1228663529
exero
2008-12-07 18:25
2011.01.30
Потоки и двухядерные процы


15-1286122969
@!!ex
2010-10-03 20:22
2011.01.30
Java 4-ever


2-1288961946
stenfit
2010-11-05 15:59
2011.01.30
move


8-1203255568
AL2002_
2008-02-17 16:39
2011.01.30
Выковырять инфу из wav-ки


3-1252056738
Руслан
2009-09-04 13:32
2011.01.30
помогите !!!