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