Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];

Вниз

Не пойму почему не освобождается память   Найти похожие ветки 

 
VadimK   (2007-03-02 16:11) [0]

Приветствую.
Что-то я перестал понимать как освобождается память, точнее как уничтожаются объекты класса, у которыч Owner = Self т.е сам объект класса.
Пример:


TNewPanel = class(TPanel)
private
   FInnerPanel: TPanel;
public
  constructor Create(AOwner: TComponent); override;
  destructor  Destroy; override;
end;

constructor TNewPanel.Create(AOwner: TComponent);
begin
 inherited;
 FInnerPanel := TPanel.Create(Self);
end;

destructor TNewPanel.Destroy;
begin
 inherited;
end;


после уничтожения TNewPanel память, выделенная при создании FInnerPanel не освобождается, а ведь скорее всего должна, поскольку Owner у нее Self, т.е. TNewPanel.
А если я делаю так:

destructor TNewPanel.Destroy;
begin
 FInnerPanel.Free;
 inherited;
end;

то память освобождается. Но ведь это не верно. Так я должен был сделать если бы у FInnerPnael был бы Owner = nil. Подскажите как правильно, всетаки Owner = self или nil надо присваивать в этом случае?


 
VadimK   (2007-03-02 16:14) [1]

Забыл добавить, у меня сама TNewPanel создается с Owner = nil, может в этом проблема?


 
Сергей М. ©   (2007-03-02 16:19) [2]

А начерта, скажи пож., компоненту владеть самим собой ?)


 
VadimK   (2007-03-02 16:22) [3]

Я его создаю в runtime и в runtime уничтожаю, мне не надо привязываеть его к чему-либо.


 
Сергей М. ©   (2007-03-02 16:22) [4]

Пардон, все у тебя правильно.

> после уничтожения TNewPanel память, выделенная при создании
> FInnerPanel не освобождается


С чего взял ?


 
Сергей М. ©   (2007-03-02 16:24) [5]

И почему бы создание InnerPanel не вынести в AfterConstruction ?


 
Аноним   (2007-03-02 17:03) [6]


> И почему бы создание InnerPanel не вынести в AfterConstruction
> ?


Зачем?


 
Сергей М. ©   (2007-03-02 17:25) [7]


> Аноним   (02.03.07 17:03) [6]


Это, конечно, не принципиально, но довольно логично.


 
Аноним   (2007-03-02 17:51) [8]


> Сергей М. ©


> Это, конечно, не принципиально, но довольно логично.


Думаю, что нет.
Предположим, есть еще один потомок - от TNewPanel
и он перекрывает конструктор.
Получится, что после вызова inherited
InnerPanel еще не создана, и если нужно с ней работать, это тоже придется выносить в AfterConstruction, что непривычно

А какие доводы "за"?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.036 c
15-1171114436
Cyrax
2007-02-10 16:33
2007.03.25
Смысл параметров эллиптической дуги в vdx-формате Visio 2003


15-1172903795
atruhin
2007-03-03 09:36
2007.03.25
Можно ли лицензировать пиратский Windows 2003 Server


2-1173082254
Нуб
2007-03-05 11:10
2007.03.25
matrix


2-1172735792
Стас
2007-03-01 10:56
2007.03.25
EControlC


2-1172873525
pasha star
2007-03-03 01:12
2007.03.25
как вставить звук .wav в .exe ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский