crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Удаление виджета за ненадобностью.
edwardoid
  опции профиля:
сообщение 14.6.2011, 12:17
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 171
Регистрация: 1.5.2008
Из: Ереван, Армения
Пользователь №: 164

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть объект QMdiArea в котором несколько окон( класс MDIChild наследует QMdiSubWindow). Проблема в том, что чем больше оконо я открываю( создаю экземпляры MDIChild) тем больше памяти выделяется(очевидно). Но когда закрываю окна, память не высвобождается. Судя по всему Qt оставляет удаление да потом, когда все прилжение закрывать понадобится. Так мне не надо. Потому как постоянно память выделяется и остается занятой, хотя сами объекты не нужны совсем.
Вопрос: Как освободить ненужную память?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 9)
RazrFalcon
  опции профиля:
сообщение 14.6.2011, 12:56
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Цитата
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
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 171
Регистрация: 1.5.2008
Из: Ереван, Армения
Пользователь №: 164

Спасибо сказали: 0 раз(а)




Репутация:   0  


По ходу да, только все равно обычный Task manager все равно показывает старое значение занятой памяти.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 14.6.2011, 13:25
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


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


Сообщение отредактировал silver47 - 14.6.2011, 13:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 14.6.2011, 14:47
Сообщение #5


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


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

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


PS: с каких это пор мы верим диспетчеру? Тем более виндовому...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
edwardoid
  опции профиля:
сообщение 14.6.2011, 15:56
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 171
Регистрация: 1.5.2008
Из: Ереван, Армения
Пользователь №: 164

Спасибо сказали: 0 раз(а)




Репутация:   0  


:lol: Понимаю ваше удивление, увы сейчас мне верить нечему кроме как ТМ.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.6.2011, 16:08
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(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
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


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


Не знаю. Пробовал делать так, деструктор не вызывался сразу после закрытия окна. А вот если поставить флаг удалять виджет сразу после закрытия - то деструктор вызывается сразу же после закрытия. В общем, по итогам: или флаг Qt::WA_DeleteOnClose или ручками delete %Имя виджета%
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.6.2011, 6:06
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Деструктор вызовется при возвращении в цикл обработки событий, см. доку по QObject::deleteLater()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
edwardoid
  опции профиля:
сообщение 15.6.2011, 13:34
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 171
Регистрация: 1.5.2008
Из: Ереван, Армения
Пользователь №: 164

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

Как посмотреть сколько места нимает каждый объект в RAM? Как проверить на прожорливость программу?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.5.2022, 23:59