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

最佳答案

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

  • QObject 树结构
  • 托管指针类

  • 由于显而易见的原因,两者并没有真正融合得很好。

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

    管理动态分配对象的另一种方法是托管指针类,this paper 对此进行了很好的解释。总结一下:
  • QScopedPointer 类存储一个指向动态分配的对象的指针,并在销毁时将其删除”,因此当您需要具有清晰明确的所有权和生命周期的对象时非常有用。
  • QSharedPointer 类持有对共享指针的强引用 [并且] 当它超出范围时将删除它持有的指针,前提是没有其他 QSharedPointer 对象引用它”因此当所有权不明确时很好,但您要确保它不会丢失并成为内存泄漏。 QWeakPointer 可用于共享指针而不暗示任何所有权。

  • 正如您所看到的,一些 protected 指针类可以与 QObject 树一起使用,但是您应该确保在这样做之前彻底阅读并理解文档,否则最终可能会导致数据结构损坏。

    关于c++ - QT 中的动态内存释放,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9128748/

    10-13 06:12