Qt QPointer和删除对象

Qt QPointer和删除对象,qt,qdialog,qpointer,Qt,Qdialog,Qpointer,我有一个Qt应用程序,它使用QPointers来打开新的UI对话框(小部件)。主应用程序可以有许多相同的小部件加载不同的数据。我遇到的问题是删除和释放每个小部件的内存。如果我监视程序的RAM使用情况,每次单击按钮打开这些新部件中的一个时,它都会增加RAM,当我关闭该部件时,它似乎不会释放RAM。我尝试过使用deleteLater和其他解决方案,但程序中不断出现崩溃 下面是一些示例代码: QPointer<ListReservations> listResWindow = new Li

我有一个Qt应用程序,它使用
QPointers
来打开新的UI对话框(小部件)。主应用程序可以有许多相同的小部件加载不同的数据。我遇到的问题是删除和释放每个小部件的内存。如果我监视程序的RAM使用情况,每次单击按钮打开这些新部件中的一个时,它都会增加RAM,当我关闭该部件时,它似乎不会释放RAM。我尝试过使用
deleteLater
和其他解决方案,但程序中不断出现崩溃

下面是一些示例代码:

QPointer<ListReservations> listResWindow = new ListReservations(resID);
listResWindow->setNum(numpeople);
listResWindow->show();
QPointer listResWindow=新的ListReservations(剩余);
listResWindow->setNum(numpeople);
listResWindow->show();
这将调用声明为
QDialog
(非模态)的“
listpreservations
”小部件。在该对话框中,我有一个按钮来关闭调用
QWidget::close()
插槽的窗口

我想问题是我的主程序(有
QPointer
)如何知道对话框何时关闭,然后释放对话框并(如果可能)删除指针以节省更多内存

我认为您可能能够对
QPointer
对象执行
QConnect()
,但我似乎找不到任何允许指针通过的信号或插槽,更不用说在对话框确实关闭并准备删除时发送信号了

也许我需要在主程序中使用某种函数,它接受一个通用指针对象,然后让
QDialog
在调用它自己的close slot之前调用它?在这个功能中,它会通过自身被摧毁吗?只是扔掉了我试图实现但失败的想法


我不认为我可以在其他地方重复使用相同的指针,因为理论上可以同时打开多个
ListReservations
窗口。

确保使用
QWidget::setAttribute()
在对话框上设置
Qt::WA\u DeleteOnClose
属性标志。这样可以确保对话框在关闭时被正确销毁。有关更多详细信息,请参阅

假设内存现在已正确释放,指针应自以下位置失效:

一个受保护的指针, 行为就像一个普通的C++指针T*, 除了自动设置为 当引用的对象为 销毁(与普通C++指针不同) 这就成了“悬而未决的指针” (此类案件)


你的第一个建议是在收盘时删除。但是,当QPointer对象指向的对象被删除时,QPointer对象将自动设置为NULL,因此不需要onDialogClosed插槽(我可以看到)。我以前从未使用过
QPointer
,并假设它没有这种行为,感谢您提供的信息。我将更新答案。我还应该补充一点,在使用QPointer到另一个线程所拥有的对象时,可能存在竞争条件。在这种情况下,可以删除对象而不将QPointer对象设置为0。