【问题标题】:Dynamic memory Deallocation in QTQT中的动态内存释放
【发布时间】:2012-02-03 21:13:33
【问题描述】:

QT 编码中动态分配的指针是如何被销毁的,因为我们没有为它们编写特定的析构函数?

【问题讨论】:

  • 你能举个例子吗?

标签: c++ qt


【解决方案1】:

扩展Neox's answer,Qt有两种对象管理方法:

  1. QObject 树形结构
  2. 托管指针类

两者并没有很好地混合,原因显而易见。

QObjects 可以是“免费的”或有父级。当一个 QObject 有它的父集时(通过为 QObject 构造函数提供指向另一个 QObject 的指针,或者通过调用 setParent()),父 QObject 成为子 QObject 的所有者,并确保它的任何子 QObject 在它被销毁时被销毁是。还有几种方法可用于检查子/父关系。

管理动态分配对象的另一种方法是托管指针类,this paper 解释得很好。总结一下:

  • QScopedPointer 类存储指向动态分配对象的指针,并在销毁时将其删除”,因此当您需要具有明确所有权和生命周期的对象时非常有用。
  • QSharedPointer 类持有对共享指针的强引用 [并且] 将在超出范围时删除它持有的指针,前提是没有其他 QSharedPointer 对象正在引用它”,因此在所有权为没有那么明确,但你要确保它不会丢失并成为内存泄漏。 QWeakPointer 可用于共享指针而不暗示任何所有权。

如您所见,一些受保护的指针类可以与 QObject 树一起使用,但您应该确保在这样做之前彻底阅读并理解文档,否则您可能会得到一个损坏的数据结构。

【讨论】:

  • 你能推荐一本学习QT的书,它涵盖了像我这样的初学者的基础知识。我有 QT4 书籍的 C++ GUI 编程,但它没有提供太多帮助!
  • 你不需要一本书:使用 Qt 文档!首先浏览一些tutorials。保留class reference 并查找您不理解的任何内容。我建议也使用 Qt Creator,只需按 CTRL+K 并键入“?”您可以在 Qt Creator 中搜索 Qt 文档。
【解决方案2】:

简短的回答是:

QObjects 在对象树中组织自己。当您创建一个以另一个对象为父对象的 QObject 时,它会被添加到父对象的 children() 列表中,并在父对象存在时被删除。

Qt 有一个关于框架内对象层次结构和所有权的很好的文档。你可以阅读它here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2016-05-09
    • 2011-03-17
    • 2013-04-14
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多