QPointer и удаление объектов - PullRequest
3 голосов
/ 03 марта 2010

У меня есть приложение Qt, которое использует QPointers для вызова новых диалогов пользовательского интерфейса (виджетов). Основное приложение может иметь множество одинаковых виджетов, загруженных разными данными. У меня проблема в удалении и освобождении памяти для каждого виджета. Если я наблюдаю за использованием оперативной памяти программы, каждый раз, когда я нажимаю кнопку, чтобы открыть один из этих новых виджетов, он увеличивает оперативную память, а когда я закрываю виджет, кажется, что он не освобождает оперативную память. Я пытался использовать deleteLater и другие решения, но в программе постоянно возникают сбои.

Пример кода приведен здесь:

QPointer<ListReservations> listResWindow = new ListReservations(resID);
listResWindow->setNum(numpeople);
listResWindow->show();

Это вызовет виджет «ListReservations», который объявлен как QDialog (НЕ модальный). В этом диалоговом окне у меня есть кнопка, чтобы закрыть окно, которое вызывает слот QWidget::close().

Полагаю, вопрос в том, как моя основная программа (с QPointer) узнает, когда диалоговое окно закрыто, а затем освобождает диалоговое окно и (если возможно) удаляет указатель, чтобы сохранить еще больше памяти ...

Я думал, что вы могли бы сделать QConnect() для объекта QPointer, но я не могу найти какие-либо сигналы или слоты, которые позволили бы пройти указатель, тем более посылать сигнал, как только Диалог действительно закрыт и готов к удалению.

Может быть, мне нужна какая-то функция в основной программе, которая принимает объект общего указателя, а затем вызывает QDialog перед вызовом своего собственного закрытого слота? В этой функции это пройдет само, чтобы быть уничтоженным? Просто выбрасываю идеи, которые я пытался реализовать, но потерпел неудачу в ....

Я не думаю, что смогу повторно использовать тот же указатель в другом месте, потому что теоретически у вас может быть открыто несколько окон ListReservations одновременно.

1 Ответ

3 голосов
/ 03 марта 2010

Убедитесь, что вы установили флаг атрибута Qt::WA_DeleteOnClose в диалоге, используя QWidget::setAttribute(). Это должно гарантировать, что диалоговое окно должным образом уничтожено, когда оно закрыто. Более подробную информацию смотрите в документации Qt .

Предполагая, что память теперь должным образом освобождена, указатель должен сделать себя недействительным из документации Qt :

Защищенный указатель, QPointer, ведет себя как обычный указатель C ++ T *, за исключением того, что он автоматически устанавливается на 0, когда ссылка на объект уничтожен (в отличие от обычных указателей C ++, которые становятся "висящими указателями" в такие случаи)

...