QPointer и удаление объектов
Вопрос
У меня есть приложение QT, которое использует QPointers, чтобы открыть новые диалоги UI (виджеты). Основное приложение может иметь многочисленные из того же виджета, загруженного разными данными. Проблема у меня есть в удалении и освобождении памяти для каждого виджета. Если я отслеживаю использование программы ОЗУ, каждый раз, когда я нажимаю кнопку, чтобы открыть одну из этих новых виджетов, он увеличивает оперативную память, и когда я закрываю виджет, он, похоже, не освобождает ОЗУ. Я пытался использовать deleteLater
и другие решения, но продолжайте попадания в программу.
Какой пример код здесь:
QPointer<ListReservations> listResWindow = new ListReservations(resID);
listResWindow->setNum(numpeople);
listResWindow->show();
Это позвонит виджету «ListResvations», который объявлен как QDialog
(Не модал). В этом диалоге у меня есть кнопка, чтобы закрыть окно, которое вызывает QWidget::close()
Слот.
Я думаю, вопрос в том, как моя главная программа (которая имеет QPointer
) Знайте, когда диалог закрыт, а затем освободить диалог и (если возможно) Удалить указатель, чтобы сохранить еще больше памяти ...
Я думал, что вы сможете сделать QConnect()
к тому QPointer
Объект, но я не могу найти какие-либо сигналы или слоты, которые позволили бы пропустить указатель, гораздо меньше отправлять сигнал после того, как диалоговое окно действительно закрыто и готово к удалению.
Может быть, мне нужна какая-то функция в основной программе, которая принимает общий объект указателя, а затем позвоните в QDialog, что перед вызовом его собственного закрытого слота? В этой функции она пройдет себя быть разрушенным? Просто выбрасываю идеи, которые я пытался реализовать, но не удалось ....
Я не думаю, что могу повторно использовать один и тот же указатель в другом месте, потому что в теории у вас может быть несколько окон открытыми с листовыми ссылками.
Решение
Убедитесь, что вы установили Qt::WA_DeleteOnClose
Флаг атрибута в вашем диалоговом окне с использованием QWidget::setAttribute()
. Отказ Это должно убедиться, что диалог правильно разрушен, когда он закрыт. Увидеть Qt Документация Больше подробностей.
Предполагая, что память теперь правильно освобождена, указатель должен недействовать сам, из Qt Документация:
Охраняемый указатель, QPointer, ведет себя как обычный указатель C ++ T *, за исключением того, что он автоматически устанавливается на 0, когда ссылка на объект (в отличие от нормальных указателей C ++, которые становятся «висящими указателями» в таких случаях)