Форум: "Начинающим";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];
ВнизНе пойму почему не освобождается память Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.036 c