QObject内存管理和智能指针

Den*_*kov 2 c++ qt

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

Adr*_*vat 6

您可能知道,销毁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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您的对象仅与其父对象寿命相关。在这种情况下,您将不需要在其上创建其他智能指针,并且可以将其存储为一个简单的指针。QObject*

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

    // Get children
    auto childrenList = this->children();
    // Find a specific child
    MyObject* child = this->findChild<MyObject*>("specific name");
    
    Run Code Online (Sandbox Code Playgroud)

如果您遇到这些情况之一,并且您的对象是共享的,则您可能也想使用QObjectPointer类型,只要指针QObject被销毁,它将自动重置。

在以下情况下使用智能指针:

  1. 你的目标是不是一个QObject基础型的,当然
  2. 您的对象是本地对象(在作用域末尾删除),在这种情况下,您需要一个QScopedPointerstd::unique_ptr。QObject育儿在这里最有可能被矫kill过正,并且很危险。
  3. 您的对象是共享对象,因此需要一个QSharedPointerstd::shared_pointer/ std::weak_ptr。同样,QObject育儿可以随时删除您QObject,这不是使用共享指针时想要的。

以上都不是?

然后由您决定,它们有不同的用途。

  • 在与Qt GUI相关的代码中,我倾向于选择QObject育儿:简单,并且可以与Qt代码很好地集成在一起。不过,如果您正在调试,请谨慎一点,因为调用堆栈将不太清楚。
  • 在UI之外,或者与非UI相关的代码进行交互,我更喜欢纯C ++:外部依赖关系越少越好!