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