Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Удаление виджета за ненадобностью.

Автор: edwardoid 14.6.2011, 12:17

Есть объект QMdiArea в котором несколько окон( класс MDIChild наследует QMdiSubWindow). Проблема в том, что чем больше оконо я открываю( создаю экземпляры MDIChild) тем больше памяти выделяется(очевидно). Но когда закрываю окна, память не высвобождается. Судя по всему Qt оставляет удаление да потом, когда все прилжение закрывать понадобится. Так мне не надо. Потому как постоянно память выделяется и остается занятой, хотя сами объекты не нужны совсем.
Вопрос: Как освободить ненужную память?

Автор: RazrFalcon 14.6.2011, 12:56

Цитата
When you create your own subwindow, you must set the Qt::WA_DeleteOnClose widget attribute if you want the window to be deleted when closed in the MDI area. If not, the window will be hidden and the MDI area will not activate the next subwindow.
Оно?

Ну или в деструкторе:
delete mdiChild1;
//или
mdiChild1->deleteLater();

Автор: edwardoid 14.6.2011, 13:17

По ходу да, только все равно обычный Task manager все равно показывает старое значение занятой памяти.

Автор: silver47 14.6.2011, 13:25

mdiChild1->deleteLater(); - недостаточно. Деструктор не будет вызван. Необходимо в конструкторе класса напрямую указать:

this->setAttribute(Qt::WA_DeleteOnClose);

Автор: RazrFalcon 14.6.2011, 14:47

Цитата(silver47 @ 14.6.2011, 13:25) *
mdiChild1->deleteLater(); - недостаточно. Деструктор не будет вызван. Необходимо в конструкторе класса напрямую указать:
this->setAttribute(Qt::WA_DeleteOnClose);

Именно это я выше и написал.


PS: с каких это пор мы верим диспетчеру? Тем более виндовому...

Автор: edwardoid 14.6.2011, 15:56

:lol: Понимаю ваше удивление, увы сейчас мне верить нечему кроме как ТМ.

Автор: Litkevich Yuriy 14.6.2011, 16:08

Цитата(edwardoid @ 14.6.2011, 15:17) *
Но когда закрываю окна, память не высвобождается.
Нужно делать так, как сказал silver47, т.е. QWidget::setAttribute(Qt::WA_DeleteOnClose);
Цитата(silver47 @ 14.6.2011, 16:25) *
mdiChild1->deleteLater(); - недостаточно. Деструктор не будет вызван.
Это почему?

Автор: silver47 15.6.2011, 4:59

Цитата(Litkevich Yuriy @ 14.6.2011, 19:08) *
Это почему?


Не знаю. Пробовал делать так, деструктор не вызывался сразу после закрытия окна. А вот если поставить флаг удалять виджет сразу после закрытия - то деструктор вызывается сразу же после закрытия. В общем, по итогам: или флаг Qt::WA_DeleteOnClose или ручками delete %Имя виджета%

Автор: Litkevich Yuriy 15.6.2011, 6:06

Деструктор вызовется при возвращении в цикл обработки событий, см. доку по QObject::deleteLater()

Автор: edwardoid 15.6.2011, 13:34

Как посмотреть сколько места нимает каждый объект в RAM? Как проверить на прожорливость программу?

Как посмотреть сколько места нимает каждый объект в RAM? Как проверить на прожорливость программу?

Автор: RazrFalcon 15.6.2011, 16:58

Какая ОС?
На лине это делает valgrind.

Автор: edwardoid 15.6.2011, 22:51

Цитата(RazrFalcon @ 15.6.2011, 18:58) *
Какая ОС?
На лине это делает valgrind.

Приходится работать под Windows 7, а под Linux есть конечно gcc, gdb, gprof, valgrind...

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)