QT中的动态内存释放

use*_*272 3 c++ qt

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

Sam*_*mer 8

为了扩展Neox的答案,Qt有两种对象管理方法:

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

这两者并没有真正混合得很好,原因很明显.

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

另一种管理动态分配对象的方法是托管指针类,本文非常好地解释了这一点.总结一下:

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

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