QScopedPointer vs parent

问题描述 投票:0回答:1

我需要对下一个情况做一些解释。假设我们有下一个代码:

class MyClass : public QObject
{ 
    public:
    MyClass(QObject* parent = nullptr)
    {
        m_member.reset(new QObject(this));
    }
    ~MyClass(){} override;
    private: 
    QScopedPointer< QObject> m_member;
};

我无法理解将父对象传递给QScopedPointer是否安全。当父对象和智能指针两次删除对象时,可能是任何情况都会导致崩溃?

qt qscopedpointer
1个回答
0
投票

这是完全安全的。以下是MyClass实例被破坏时发生的情况:

  1. MyClass的析构函数被调用(在你的例子中没有任何作用)
  2. MyClass的所有成员变量都被破坏了。在你的情况下,QScopedPointer的析构函数被调用,这意味着删除了孩子QObject。当QObject被摧毁时它是removed from its parent's list of children,所以父母不再试图删除这个QObject
  3. 你的QObject实例的MyClass的析构函数被调用,并且它看不到要删除的子项

如果没有理由动态分配,您可能还需要考虑按值保存您的子成员QObject

© www.soinside.com 2019 - 2024. All rights reserved.