Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не пойму почему не освобождается память [D7, Win2k, WinXP]


VadimK ©   (2007-03-02 16:11:00) 

Приветствую.
Что-то я перестал понимать как освобождается память, точнее как уничтожаются объекты класса, у которыч 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 надо присваивать в этом случае?


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


> Сергей М. ©


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


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

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


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


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


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


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


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


Зачем?


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

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


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

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


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

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

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


С чего взял ?


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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо