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