我有一个Qt应用程序,它使用QPointers来显示新的UI对话框(Widgets)。主应用程序可以有许多相同的小部件加载不同的数据。我遇到的问题是删除和释放每个小部件的内存。如果我监视程序的RAM使用情况,每次单击按钮打开其中一个新窗口小部件时,它会增加内存,当我关闭窗口小部件时,它似乎不会释放内存。我已尝试使用deleteLater
和其他解决方案,但不断在程序中崩溃。
这里有一些示例代码:
QPointer<ListReservations> listResWindow = new ListReservations(resID);
listResWindow->setNum(numpeople);
listResWindow->show();
这将调用“ListReservations”小部件,该小部件被声明为QDialog
(非模态)。在那个对话框中,我有一个按钮来关闭调用QWidget::close()
插槽的窗口。
我想问题是我的主程序(有QPointer
)如何知道对话框何时关闭然后释放对话框并(如果可能)删除指针以节省更多内存...
我以为你可以对QConnect()
对象做QPointer
,但我似乎无法找到任何允许传递指针的信号或插槽,更不用说发送了对话框确实关闭并准备删除后的信号。
也许我需要在主程序中使用某种函数来获取通用指针对象,然后在调用它自己的关闭插槽之前调用QDialog?在那个功能中,它会通过自身被摧毁?只是抛弃我试图实现但在......失败的想法。
我认为我不能在其他地方重复使用相同的指针,因为理论上你可以同时打开多个ListReservations窗口。
答案 0 :(得分:3)
确保使用Qt::WA_DeleteOnClose
在对话框中设置QWidget::setAttribute()
属性标记。这应该确保对话框在关闭时被正确销毁。有关详细信息,请参阅Qt documentation。
假设现在可以正确释放内存,指针应该从Qt documentation:
自身失效守卫指针,QPointer, 表现得像普通的C ++指针T *, 除了它被自动设置为 引用的对象为0时为0 被破坏(与普通的C ++指针不同, 它成为“悬空指针” 这种情况)