QScopedPointer 与父级
QScopedPointer vs parent
我需要对接下来的情况做一些解释。假设我们有下一个代码:
class MyClass : public QObject
{
public:
MyClass(QObject* parent = nullptr)
{
m_member.reset(new QObject(this));
}
~MyClass(){} override;
private:
QScopedPointer< QObject> m_member;
};
我不明白将具有父对象的对象传递给 QScopedPointer 是否安全。会不会是对象被parent和智能指针删除两次导致崩溃的情况?
这是完全安全的。这是 MyClass
的实例被销毁时发生的情况:
MyClass
的析构函数被调用(在您的示例中什么都不做)
MyClass
的所有成员变量都被销毁。在你的例子中,QScopedPointer
的析构函数被调用,这意味着子 QObject
被删除。当一个 QObject
被销毁时它是 removed from its parent's list of children,所以父级不再试图删除这个 QObject
QObject
的 MyClass
实例的析构函数被调用,它没有看到要删除的子项
如果没有理由动态分配您的子成员 QObject
,您可能还想考虑按价值持有它
我需要对接下来的情况做一些解释。假设我们有下一个代码:
class MyClass : public QObject
{
public:
MyClass(QObject* parent = nullptr)
{
m_member.reset(new QObject(this));
}
~MyClass(){} override;
private:
QScopedPointer< QObject> m_member;
};
我不明白将具有父对象的对象传递给 QScopedPointer 是否安全。会不会是对象被parent和智能指针删除两次导致崩溃的情况?
这是完全安全的。这是 MyClass
的实例被销毁时发生的情况:
MyClass
的析构函数被调用(在您的示例中什么都不做)MyClass
的所有成员变量都被销毁。在你的例子中,QScopedPointer
的析构函数被调用,这意味着子QObject
被删除。当一个QObject
被销毁时它是 removed from its parent's list of children,所以父级不再试图删除这个QObject
QObject
的MyClass
实例的析构函数被调用,它没有看到要删除的子项
如果没有理由动态分配您的子成员 QObject
,您可能还想考虑按价值持有它