【问题标题】:QPointer and deleting objectsQPointer 和删除对象
【发布时间】:2010-03-03 13:47:23
【问题描述】:

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

这里有一些示例代码:

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

这将调用声明为QDialog(非模态)的“ListReservations”小部件。在那个对话框中,我有一个按钮来关闭调用QWidget::close() 插槽的窗口。

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

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

也许我在主程序中需要某种函数,它接受一个通用指针对象,然后在调用它自己的关闭槽之前让QDialog 调用它?在那个函数中,它会通过自身被销毁吗?只是抛出我试图实施但失败的想法......

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

【问题讨论】:

    标签: qt qdialog qpointer


    【解决方案1】:

    确保使用QWidget::setAttribute() 在对话框中设置Qt::WA_DeleteOnClose 属性标志。这应该确保对话框在关闭时被正确销毁。有关详细信息,请参阅Qt documentation

    假设内存现在已被正确释放,指针应该使自己失效,来自Qt documentation

    一个受保护的指针,QPointer, 表现得像一个普通的 C++ 指针 T *, 除了它自动设置为 0 当引用的对象是 销毁(与普通的 C++ 指针不同, 这成为“悬空指针” 这种情况)

    【讨论】:

    • 您对关闭时删除的第一个建议是准确的。但是,当它指向的对象被删除时,QPointer 对象将自动设置为 NULL,因此不需要 onDialogClosed 插槽(我可以看到)。
    • 我以前从未使用过QPointer,并认为它没有这种行为,感谢您提供信息。我会更新答案。
    • 我还应该补充一点,在将 QPointer 用于由不同线程拥有的对象时可能存在竞争条件。在这种情况下,可能会在 QPointer 对象尚未设置为 0 的情况下删除对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多