Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1172815231
ZeroDivide
2007-03-02 09:00
2007.03.25
Как называется язык в котором вы программируете на Delphi?


2-1172674149
ds120hp
2007-02-28 17:49
2007.03.25
Связь форм


15-1171568690
Johnmen
2007-02-15 22:44
2007.03.25
Что Вам мешает купить Windows?


3-1167388919
reb00ter
2006-12-29 13:41
2007.03.25
Обработка потери соединения с сервером


2-1172512939
Remember
2007-02-26 21:02
2007.03.25
Из Word в OleContainer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский