Closed. This question is opinion-based。它当前不接受答案。
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
3年前关闭。
Improve this question
使用QObject内存管理和智能指针之间的主要区别是什么?什么时候使用这种机制更好? 当然,您的对象是QWidget或与GUI相关的 您不需要/想要存储指针
您的对象仅与其父对象寿命相关。在这种情况下,您将不需要在其上创建其他智能指针,并且可以将其存储为简单的 您需要
如果您属于这些情况之一,并且您的对象是共享的,则您可能也想使用
在以下情况下使用智能指针:
您的对象不是基于 您的对象是本地对象(在范围末尾删除),在这种情况下,您需要 您的对象是共享的,因此需要
以上都不是?
然后由您决定,它们有不同的用途。
在Qt GUI相关的代码中,我倾向于 在UI之外,或与非UI相关的代码进行交互,我更喜欢纯C++:外部依赖关系越少越好!
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
3年前关闭。
Improve this question
使用QObject内存管理和智能指针之间的主要区别是什么?什么时候使用这种机制更好?
最佳答案
您可能知道,在破坏时QObject
将破坏其所有子代,这就是我们所说的“QObject内存管理”。通常,将子级从其构造函数中使用QObject *parent
添加到new QObject(parent);
中。
另一方面,智能指针更多是类别,而不是特定类型,
包括共享指针,自动指针等,它们在C++中的STL和Qt中都有一个实现(仅用于命名这两个)。
因此,即使它们不能直接比较,我还是这样总结:
在以下情况下使用QObject内存管理:
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::unique_ptr
。 QObject育儿在这里最有可能被矫kill过正,并且很危险。 QSharedPointer
或std::shared_pointer
/ std::weak_ptr
。同样,QObject育儿可以随时删除您的QObject
,这不是使用共享指针时想要的。 以上都不是?
然后由您决定,它们有不同的用途。
QObject
育儿:简单,并且可以与Qt代码很好地集成。不过,如果您正在调试,则调用栈要谨慎一些,以免使您难以理解。 关于c++ - QObject内存管理和智能指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46861596/
10-13 08:22