QObject内存管理和智能指针

时间:2017-10-21 08:48:11

标签: c++ qt

使用QObject内存管理和智能指针之间的主要区别是什么?什么时候使用这个或那个机制更好?

1 个答案:

答案 0 :(得分:4)

正如您可能知道的那样,在破坏QObject会破坏他们所有的孩子,这就是我们所说的" QObject内存管理"。儿童通常会使用QObject *parent从其构造函数添加到new QObject(parent);

另一方面,

智能指针更像是一个类别而不是特定类型,  包括共享指针,自动指针等,它们在C ++中的STL Qt中都有一个实现(仅限于这两个)。

所以尽管它们没有直接可比性,但我会这样总结:

在......

时使用QObject内存管理
  1. 您的对象当然是QWidget,或与GUI相关
  2. 您不需要/想要存储指针

    MyObject *object = new MyObject(this);
    object->setSomething();
    // And you don't ever need to access it later
    
  3. 您的对象仅与其父级生命周期相关联。在这种情况下,您不需要在其上创建额外的智能指针,您将能够将其存储为简单的QObject*

  4. 您需要QObject层次结构和/或查找功能,这些功能可让您执行以下操作。有关详细信息,请参阅QObject documentation

    // Get children
    auto childrenList = this->children();
    // Find a specific child
    MyObject* child = this->findChild<MyObject*>("specific name");
    
  5. 如果您处于其中一种情况并且您的对象已共享,您可能也希望使用QObjectPointer类型,只要指向QObject被销毁,它就会自动重置。

    在......

    时使用智能指针
    1. 您的对象基于QObject的类型,当然
    2. 您的对象只是一个本地对象(在范围的末尾删除),在这种情况下,您需要QScopedPointerstd::auto_ptr。 QObject育儿在这里很可能过度,而且很危险。
    3. 您的对象已共享,因此需要QSharedPointerstd::shared_pointer。同样,QObject育儿可以随时删除QObject,这在使用共享指针时不是您想要的。
    4. 以上都不是吗?

      然后由你决定,他们服务于不同的目的。我更倾向于QObject为了它的简单性(简单对象,没有特定的指针类型),但是如果你正在调试,调用堆栈可能不太清楚。