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

Вниз

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

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

Наверх




Память: 0.48 MB
Время: 0.03 c
3-1167225881
RomanH
2006-12-27 16:24
2007.03.25
Набор данных возвращаемый XП


15-1172501155
Германн
2007-02-26 17:45
2007.03.25
Бабуины, бабуины. Вот шимпанзе - это да!


1-1169895678
Garacio
2007-01-27 14:01
2007.03.25
Запустить программу в режиме совместимости с ...


6-1160830636
Вася
2006-10-14 16:57
2007.03.25
свойства протокола TCP/IP в реестре WINDOWS XP


15-1172752338
@!!ex
2007-03-01 15:32
2007.03.25
Просьба сделать в поиске настраиваемый фильтр.