Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1287174545
Юрий
2010-10-16 00:29
2011.01.30
С днем рождения ! 16 октября 2010 суббота


15-1286772364
12
2010-10-11 08:46
2011.01.30
Посоветуйте литературу по термохххх


2-1289487120
vegarulez
2010-11-11 17:52
2011.01.30
TWebbrowser, как определить активное поле формы.


2-1289654665
mfender
2010-11-13 16:24
2011.01.30
Record и память


2-1288712243
Doctordradd
2010-11-02 18:37
2011.01.30
Правильный импорт данных из Экселя





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский