Главная страница
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.045 c
2-1172962863
buben
2007-03-04 02:01
2007.03.25
хэндл процесса


11-1152008286
Maloric
2006-07-04 14:18
2007.03.25
Чтение имени компонента из файла


2-1172939940
Roman_S
2007-03-03 19:39
2007.03.25
Как узнать размер каталога по пути?


15-1172653890
Elen
2007-02-28 12:11
2007.03.25
Вопрос про кривые OCX


6-1160139325
urdolphin
2006-10-06 16:55
2007.03.25
Утечка памяти TServerSocket и TClientSocket