Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Удаление виджета за ненадобностью.
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
edwardoid
Есть объект QMdiArea в котором несколько окон( класс MDIChild наследует QMdiSubWindow). Проблема в том, что чем больше оконо я открываю( создаю экземпляры MDIChild) тем больше памяти выделяется(очевидно). Но когда закрываю окна, память не высвобождается. Судя по всему Qt оставляет удаление да потом, когда все прилжение закрывать понадобится. Так мне не надо. Потому как постоянно память выделяется и остается занятой, хотя сами объекты не нужны совсем.
Вопрос: Как освободить ненужную память?
RazrFalcon
Цитата
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
По ходу да, только все равно обычный Task manager все равно показывает старое значение занятой памяти.
silver47
mdiChild1->deleteLater(); - недостаточно. Деструктор не будет вызван. Необходимо в конструкторе класса напрямую указать:
this->setAttribute(Qt::WA_DeleteOnClose);
RazrFalcon
Цитата(silver47 @ 14.6.2011, 13:25) *
mdiChild1->deleteLater(); - недостаточно. Деструктор не будет вызван. Необходимо в конструкторе класса напрямую указать:
this->setAttribute(Qt::WA_DeleteOnClose);

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


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


Не знаю. Пробовал делать так, деструктор не вызывался сразу после закрытия окна. А вот если поставить флаг удалять виджет сразу после закрытия - то деструктор вызывается сразу же после закрытия. В общем, по итогам: или флаг Qt::WA_DeleteOnClose или ручками delete %Имя виджета%
Litkevich Yuriy
Деструктор вызовется при возвращении в цикл обработки событий, см. доку по QObject::deleteLater()
edwardoid
Как посмотреть сколько места нимает каждый объект в RAM? Как проверить на прожорливость программу?

Как посмотреть сколько места нимает каждый объект в RAM? Как проверить на прожорливость программу?
RazrFalcon
Какая ОС?
На лине это делает valgrind.
edwardoid
Цитата(RazrFalcon @ 15.6.2011, 18:58) *
Какая ОС?
На лине это делает valgrind.

Приходится работать под Windows 7, а под Linux есть конечно gcc, gdb, gprof, valgrind...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.