QT中的动态内存释放

时间:2012-02-03 12:34:13

标签: c++ qt

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

2 个答案:

答案 0 :(得分:8)

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

  1. QObject树结构
  2. 托管指针类
  3. 两者并没有真正混合得很好,原因很明显。

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

    管理动态分配对象的单独方法是this paper非常好地解释的托管指针类。总结一下:

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

    正如您所看到的,一些受保护的指针类可以与QObject树一起使用,但是您应该确保在执行此操作之前仔细阅读并理解文档,否则您最终可能会损坏数据结构。

答案 1 :(得分:3)

简短的回答是:

  

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

Qt在框架内有关于对象层次结构和所有权的良好记录。你可以阅读它here