Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.027 c
11-1148150920
Виталий(гость)
2006-05-20 22:48
2007.03.25
Неожиданно возникшие Проблемы :-(


2-1172900738
Roman_S
2007-03-03 08:45
2007.03.25
Выделить несколько строк в ListView


15-1172572853
Tema
2007-02-27 13:40
2007.03.25
Обработка нескольких XML


15-1172611365
Gero
2007-02-28 00:22
2007.03.25
Лебедев облажался


15-1172460338
Slider007
2007-02-26 06:25
2007.03.25
С днем рождения ! 24 февраля




   Наверх