![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не пойму почему не освобождается память [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, может в этом проблема?