您可能知道,销毁QObject将销毁其所有子级,这就是我们所说的“ QObject内存管理”。通常将子项QObject *parent从的构造函数添加到中new QObject(parent);。
另一方面,智能指针比特定类型更是一个类别,包括共享指针,自动指针等,它们在C ++中的STL 和 Qt中都有实现(仅命名这两个)。
因此,即使它们不能直接比较,我还是这样总结:
您不需要/想要存储指针
MyObject *object = new MyObject(this);
object->setSomething();
// And you don't ever need to access it later
Run Code Online (Sandbox Code Playgroud)您的对象仅与其父对象寿命相关。在这种情况下,您将不需要在其上创建其他智能指针,并且可以将其存储为一个简单的指针。QObject*
您需要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被销毁,它将自动重置。
QObject基础型的,当然QScopedPointer或std::unique_ptr。QObject育儿在这里最有可能被矫kill过正,并且很危险。QSharedPointer或std::shared_pointer/ std::weak_ptr。同样,QObject育儿可以随时删除您QObject,这不是使用共享指针时想要的。然后由您决定,它们有不同的用途。
QObject育儿:简单,并且可以与Qt代码很好地集成在一起。不过,如果您正在调试,请谨慎一点,因为调用堆栈将不太清楚。