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++, которые в таких случаях становятся "висячими указателями")

Другие вопросы по тегам