2010-03-03 5 views
3

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

Некоторые примеры кода здесь:

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

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

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

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

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

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

ответ

3

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

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

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

+1

Вашего первый совет для удаления на закрытии - это пятно. Тем не менее, объекты QPointer будут автоматически установлены в NULL, когда объект, на который он указывает, будет удален, поэтому не должно быть необходимости в слоте onDialogClosed (что я вижу). –

+0

Я никогда раньше не использовал 'QPointer' и предполагал, что у него этого не было, спасибо за информацию. Я обновлю ответ. –

+0

Я также должен добавить, что существуют потенциальные условия гонки при использовании QPointer для объекта, принадлежащего другому потоку. В этом случае можно было бы удалить объект, если объект QPointer еще не установлен на 0. –