Closed. This question is opinion-based。它当前不接受答案。












想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。

3年前关闭。



Improve this question




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

最佳答案

您可能知道,在破坏时QObject将破坏其所有子代,这就是我们所说的“QObject内存管理”。通常,将子级从其构造函数中使用QObject *parent添加到new QObject(parent);中。

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

因此,即使它们不能直接比较,我还是这样总结:

在以下情况下使用QObject内存管理:

  • 当然,您的对象是QWidget或与GUI相关的
  • 您不需要/想要存储指针
    MyObject *object = new MyObject(this);
    object->setSomething();
    // And you don't ever need to access it later
    
  • 您的对象仅与其父对象寿命相关。在这种情况下,您将不需要在其上创建其他智能指针,并且可以将其存储为简单的QObject*
  • 您需要QObject层次结构和/或查找功能,这些功能使您可以执行以下操作。有关更多详细信息,请参见QObject documentation
    // Get children
    auto childrenList = this->children();
    // Find a specific child
    MyObject* child = this->findChild<MyObject*>("specific name");
    

  • 如果您属于这些情况之一,并且您的对象是共享的,则您可能也想使用QObjectPointer类型,只要销毁了所指向的QObject,它就会自动重置。

    在以下情况下使用智能指针:
  • 您的对象不是基于QObject的类型,当然
  • 您的对象是本地对象(在范围末尾删除),在这种情况下,您需要QScopedPointerstd::unique_ptr。 QObject育儿在这里最有可能被矫kill过正,并且很危险。
  • 您的对象是共享的,因此需要QSharedPointerstd::shared_pointer / std::weak_ptr。同样,QObject育儿可以随时删除您的QObject,这不是使用共享指针时想要的。

  • 以上都不是?

    然后由您决定,它们有不同的用途。
  • 在Qt GUI相关的代码中,我倾向于QObject育儿:简单,并且可以与Qt代码很好地集成。不过,如果您正在调试,则调用栈要谨慎一些,以免使您难以理解。
  • 在UI之外,或与非UI相关的代码进行交互,我更喜欢纯C++:外部依赖关系越少越好!
  • 关于c++ - QObject内存管理和智能指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46861596/

    10-13 08:22