【问题标题】:Do I have to delete each (pointer) element of a QSet manually?我是否必须手动删除 QSet 的每个(指针)元素?
【发布时间】:2012-01-22 13:09:02
【问题描述】:

我有一个班级成员:

QSet<QDialog*>* dialogs_;  

我需要只删除 dialogs_ 还是必须对它的每个元素都调用 delete?

【问题讨论】:

  • 您必须提供一些上下文。如果您的班级只将dialogs_ 初始化为NULL,那么不,您不需要delete 任何东西。它会做其他事情吗?我们不知道,你还没有告诉我们。

标签: c++ qt memory-management


【解决方案1】:

这样就可以了:

qDeleteAll(*dialogs_);
delete dialogs_

你也可以不取消引用:

qDeleteAll(dialogs_->begin(), dialogs->end());
delete dialogs_

【讨论】:

    【解决方案2】:

    是的,您需要以某种方式手动删除dialogs_ 中的每个QDialog,如果有的话。

    您可以自己手动遍历QSetdelete。因为QDialog 继承自QWidget,另一种方法是简单地delete 所有对话框的父级,如果父级也分配在空闲存储上,这反过来将delete 它们。

    请注意,如果您正在这样做,则没有理由在免费商店中分配 QSet。您可以保存 new/delete 操作,只需将其设为类的直接成员即可。

    QSet<QDialog*> dialogs_;
    

    这是您不必担心的一件事。手动删除。

    【讨论】:

      【解决方案3】:

      首先遍历你的集合,删除其中的每个对象,然后删除集合对象。

      但是,请注意 Qt 有它自己的内存管理,可能只是删除该集合,并让其中的对象被 Qt 的机制破坏。

      【讨论】:

      • 我已经有一段时间没有使用 Qt 了,但是我很确定当您将诸如 QDialog 之类的 ui 元素传递给父对象时,该对象将负责内存子ui元素的管理。不过不要引用我的话。
      • @ChrisParton 但是,如果您删除孩子,qt 系统会注册它。见thisthis
      猜你喜欢
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 2021-10-18
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多