Russian Qt Forum

Qt => Общие вопросы => Тема начата: maks от Июль 24, 2008, 01:46



Название: виджеты и освобождение памяти.
Отправлено: maks от Июль 24, 2008, 01:46
Добрый день. У меня такой вопрос. Большинство объектов создаются через оператор new.
Но не в одном примере я не видел чтобы память из под qt объектов освобождалась.
Надо ли освобождать из под них память?
И как удалить виджет с формы?


Название: Re: виджеты и освобождение памяти.
Отправлено: Пантер от Июль 24, 2008, 07:12
При закрытии приложения память освобождается. Если нужно раньше удалить виджет, то используй delete.


Название: Re: виджеты и освобождение памяти.
Отправлено: Alex03 от Июль 24, 2008, 08:03
При закрытии приложения память освобождается. Если нужно раньше удалить виджет, то используй delete.
Ну както Вы не правильно рассуждаете...
Память освобождать / объекты удалять надо всегда там где надо.

Для QObject и порождённых от него классов (точнее их объектов) если у объекта есть parent то этот объект уничтожается при уничтожении parent-а. Поэтому достаточно удалить parent или parent parent-а и т.д.
Если parent нулевой и объект создан на куче, то объект надо удалять. Если объект создан на стеке, то он сам удалится при выходе из "блока"/функции.
Для виджетов есть флаг Qt::WA_DeleteOnClose, позволяющий не заботиться (точнее заранее позаботиться) об удалении окна при его закрытии (В основном используется для топ-левел-виджетов).


Название: Re: виджеты и освобождение памяти.
Отправлено: Hort от Июль 24, 2008, 10:55
в дополнение к предидущему посту:

при создании виджета оператором new надо в конструктор передать указатель на предка (для соблюдения иерархической модели). зачастую этого можно не делать, если используеш Layout'ы, класс QMainWindow и подобные, где есть методы добавления или установки виджета (addWidhet(), addToolBar(), setCentralWidget() и т.п.) - тогда у добавляемого/устанавливаемого виджета втоматически устанавливается предок тот куда добавили/установили и явно можно его не указывать. некоторые виджеты обычно удаляют оператором delete сразу после использования - это например диалоговые окна.