使用QObject内存管理和智能指针之间的主要区别是什么?什么时候使用这个或那个机制更好?
答案 0 :(得分:4)
正如您可能知道的那样,在破坏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
您的对象仅与其父级生命周期相关联。在这种情况下,您不需要在其上创建额外的智能指针,您将能够将其存储为简单的QObject*
您需要QObject
层次结构和/或查找功能,这些功能可让您执行以下操作。有关详细信息,请参阅QObject documentation。
// Get children
auto childrenList = this->children();
// Find a specific child
MyObject* child = this->findChild<MyObject*>("specific name");
如果您处于其中一种情况并且您的对象已共享,您可能也希望使用QObjectPointer
类型,只要指向QObject
被销毁,它就会自动重置。
QObject
的类型,当然QScopedPointer
或std::auto_ptr
。 QObject育儿在这里很可能过度,而且很危险。QSharedPointer
或std::shared_pointer
。同样,QObject育儿可以随时删除QObject
,这在使用共享指针时不是您想要的。然后由你决定,他们服务于不同的目的。我更倾向于QObject
为了它的简单性(简单对象,没有特定的指针类型),但是如果你正在调试,调用堆栈可能不太清楚。