Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Освобождение памяти пр удалении компонентов

513
06 августа 2008 года
Yurec
228 / / 21.09.2005
Друзья, есть такой вопрос:
Имеется форма, на ней динамически создаются несколько GroupBox`ов(v_GroupBox:=TGroupBox.Create(MainForm);)
В этих групбоксах динамически создаются визуальные компоненты (чекбоксы, эдиты, бевелы) аналогичным образом (v_CheckBox:=TCheckBox.Create(GroupBox);)

Далее выполняем следующее:
for i:=0 to PanelForVisualisation.ComponentCount -1 do begin
PanelForVisualisation.Components[0].Free;
end;
данный код удалит групбоксы v_GroupBox

Вопрос: удаляются ли ФИЗИЧЕСКИ объекты принадлежащие v_GroupBox или нет?
То есть, если я удаляю некий компонент, то удалаяются ли компоненты родителем которых он является?

Пробую вешать на кнопку код, который удаляет подобным вышеописанным образом родительские групбоксы (то, что внутри групбоксов явно не удаляется), потом создает
снова групбоксы с наполнением. В итоге (судя по TaskManager) используемая память увеличивается.
8
06 августа 2008 года
mfender
3.5K / / 15.06.2005
Я так понимаю, что это ты делаешь в деструкторе групбокса?
Free уничтожает компонент, но его нужно обнулить (nil), чтобы освободить память из-под уничтоженного объекта.
Т.е.
 
Код:
PanelForVisualisation.Components[0].Free;
PanelForVisualisation.Components[0] := nil;


Либо есть уже готовое движение FreeAndNil(PanelForVisualisation.Components[0]);

Но обязательно проверяй на исключение, ибо если вдуг что - будет большая порча... )))
303
06 августа 2008 года
makbeth
1.0K / / 25.11.2004
Цитата: Yurec
Вопрос: удаляются ли ФИЗИЧЕСКИ объекты принадлежащие v_GroupBox или нет?
То есть, если я удаляю некий компонент, то удалаяются ли компоненты родителем которых он является?


Удаляются. Если правильно прописан owner (в конструкторе), то при его удалении все принадлежащие ему объекты также должны удалиться.

Цитата:
Пробую вешать на кнопку код, который удаляет подобным вышеописанным образом родительские групбоксы (то, что внутри групбоксов явно не удаляется), потом создает
снова групбоксы с наполнением. В итоге (судя по TaskManager) используемая память увеличивается.


Это ни о чем не говорит. Вполне возможно, что это особенность работы менеджера кучи. Либо косяк при создании объектов.
Вообще надо смотреть, постоянна ли такая тенденция к увеличению занимаемой памяти.
Кроме того, в последних версиях Delphi в одном из модулей есть переменная, позволяющая включить отслеживание утечек памяти при завершении работы программы (сейчас припомнить, что за переменная, к сожалению не могу - знающие люди, подскажите).

288
07 августа 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: Yurec

Вопрос: удаляются ли ФИЗИЧЕСКИ объекты принадлежащие v_GroupBox или нет?
То есть, если я удаляю некий компонент, то удалаяются ли компоненты родителем которых он является?



Не стоит путать родителя и владельца (Parent и Onwer). Как уже было сказано, контрол удалится при удалении владеющего им компонента только если у него правильно проставлен Owner.

513
07 августа 2008 года
Yurec
228 / / 21.09.2005
Объекты создаются по такому принципу:
v_Label:=TLabel.Create(v_GroupBox);
v_Label.Parent:=v_GroupBox;
то есть и овнер и парент заданы и это удаляемый родительский v_GroupBox
513
07 августа 2008 года
Yurec
228 / / 21.09.2005
 
Код:
PanelForVisualisation.Components[0].Free;
PanelForVisualisation.Components[0] := nil;

Так не проходит. "PanelForVisualisation.Components[0] := nil" вываливается с ошибкой "Cannot assign to a read-only property".
Вызов "FreeAndNil(PanelForVisualisation.Components[0])" завершается ошибкой "Constant object cannot be passed as var parameter". Как это обойти я так и не нашел. Кто-нибудь знает как решить сложившуюся ситуацию?
6
07 августа 2008 года
George
4.1K / / 05.01.2007
Components[0] - ну там вместо нуля поставь нужное число, соответствующее твоему компоненту ))
513
07 августа 2008 года
Yurec
228 / / 21.09.2005
Цитата: Washington
Components[0] - ну там вместо нуля поставь нужное число, соответствующее твоему компоненту ))



Тут всегда надо писать 0. Это связано с тем, что когда я в цикле произвожу удаление
for i:=0 to PanelForVisualisation.ComponentCount -1 do begin
PanelForVisualisation.Components[0].Free;
end;

То грубо говоря iтых компонентов нету, так как они удаляются, можно всегда уничтожать нулевой и таким образом вс удалятся.

У меня вопрос более строго характера). ранбше я всегда на все далал Free, на важно компонент переменная и т.д. На сколько это верно? Дорстаточно ли этого? или требуется обязаптельно писать = nil?

303
07 августа 2008 года
makbeth
1.0K / / 25.11.2004
Цитата: Yurec
У меня вопрос более строго характера). ранбше я всегда на все далал Free, на важно компонент переменная и т.д. На сколько это верно? Дорстаточно ли этого? или требуется обязаптельно писать = nil?


Все зависит от того, как потом будет использована переменная-ссылка на объект. Если, скажем, где-то еще также есть вызов Free, то в случае с необнуленной ссылкой получиться AV (в лучшем случае), поскольку ссылка указывает на мусор. Если же вызвать Free для ссылки = nil, то ничего не произойдет :) Просто Free устроен примерно следущим образом:

 
Код:
procedure TObject.Free;
begin
    if Self <> nil then Self.Delete;
end;
В твоем случае не вижу смысла в коде:
 
Код:
Components[0] := nil;
поскольку элемент Components[0] просто удаляется из списка компонентов.
Впрочем, чем гадать, можно просто посмотреть под отладчиком в пошаговом режиме, что на самом деле происходит ;)
14
18 августа 2008 года
Phodopus
3.3K / / 19.06.2008
Не стоит напрямую манипулировать списком Components[] объекта TComponent - не зря этот список read-only. Если уж так хочется удалить компоненты явно - используйте метод DestroyComponents(); А вообще при разрушении с корректно выставленным Owner-ом (как и было сказано) - все это произойдет автоматически
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог