Название: Создание и удаление элементов. Освобождение памяти Отправлено: Goshman от Февраль 07, 2009, 09:40 Добрый день всем!
Начал писать приложение для некой embedded железяки. С Qt ранее не встречался, но начинать когда-то надо. Амбула. Есть основной виджет Qwidget *mWid (глобальная переменная), частично включающий следующие элементы: class MainWidget : public QWidget { Q_OBJECT public: MainWidget(QWidget *parent = 0); <...> public slots: void screen_update(); <...> private: QFrame *frm; <...> }; Есть ряд классов, наследников от QFrame: class Screen_A0: public QFrame{<...>}, class Screen_A1: public QFrame{<...>}, class Screen_A2: public QFrame{<...>} и т.д. Внутреннее наполнение классов различно, но объединяет их одно: каждый класс содержит кнопки для выбора того или иного окна (Screen_A*). Кусок реализации класса: Screen_A1::Screen_A1(QWidget *parent): QFrame(parent) { <...> QPushButton *btn1 = new QPushButton(this); <...> connect(btn1, SIGNAL(released()), mWid, SLOT(screeen_update())); <...> } В обработчике screeen_update() в зависимости от типа нажатой кнопки (ID кнопки передается в глобальную переменную) должно прорисовываться то или иное окно. void MainWidget::screen_update() { int ptr; <...> delete frm; // previous frame delete switch (ptr) { case 0: frm = new Screen_A0(this); break; case 11: frm = new Screen_A1(this); break; case 12: frm = new Screen_A2(this); break; case 13: frm = new Screen_A3(this); break; <...> } } Идея была следующая: удаляю предыдущий фрейм с наполнением и следом создаю новый. Компилятор не ругается, окна отрисовываются, но есть сомнения в правильности подхода, ведь элемент удаляется по сигналу, формируемому собственной кнопкой. Удаляется ли обект? Освобождается ли память? Пробовал использовать отложенное удаление frm->deleteLater() - визуально работает также, однако я опасаюсь использовать конструкции, принципов работы которых не понимаю. Что уважаемые Гуру могут мне посоветовать? Правильно я решаю задачу перехода по окнам или есть более правильные подходы? Название: Re: Создание и удаление элементов. Освобождение памяти Отправлено: SABROG от Февраль 07, 2009, 10:01 Можно использовать аттрибут окна Qt::WA_DeleteOnClose, а по слоту вызывать не удаление самого себя, а обычный QWidget::close(). QObject::deleteLater() удаляет объект при возвращении управления в основной loop event, когда уже отработали все сигналы и слоты.
Насчет самой идеи немного не понятно что ты хочешь сделать, но возможно есть смысл посмотреть в сторону QStackedLayout или QStackedWidget. Название: Re: Создание и удаление элементов. Освобождение памяти Отправлено: BRE от Февраль 07, 2009, 10:21 А имеет ли смысл все время удалять и формировать страницы?
Может лучше использовать QStackedWidget? Название: Re: Создание и удаление элементов. Освобождение памяти Отправлено: Goshman от Февраль 07, 2009, 13:41 QStackedWidget сейчас посмотрю обязательно, спасибо.
А идея удаления окон в том, чтобы освобождать память при смене окна, которой в эмбеддид железяке всего 64 метра (а еще линукс и кутопия). Название: Re: Создание и удаление элементов. Освобождение памяти Отправлено: Goshman от Февраль 07, 2009, 20:33 Еще вопрос. Создан фрэйм frm = new Screen_A1(this). При его удалении delete frm нужно ли в деструкторе Screen_A1 удалять дочерние элементы и связи, или они удаляются автоматически?
В документации на Qt вроде ручного удаления не требуется, однако, если верить виндовому диспетчеру задач, то память при этом не высвобождается. Название: Re: Создание и удаление элементов. Освобождение памяти Отправлено: Rcus от Февраль 07, 2009, 21:27 Много раз уже про это писали: функции выделения памяти из системы довольно затратны по ресурсам (переключение контекста и все такое). Поэтому библиотека crt реализует внутренний менеждер памяти, который захватывает память у системы большими кусками и распределяет внутри приложения, а при необходимости освобождает (емнип освобождаются только полностью свободные страницы, а из-за фрагментации кучи их может быть мало)
Название: Re: Создание и удаление элементов. Освобождение памяти Отправлено: ритт от Февраль 07, 2009, 22:45 ыы...с каких пор можно верить вендовому диспетчеру задач?
|