0

我需要一些关于下一个情况的解释。假设我们有下一个代码:

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

我不明白将带有父对象的对象传递给 QScopedPointer 是否安全。当对象被父对象和智能指针两次删除并且会导致崩溃时,可能会出现任何情况吗?

4

1 回答 1

2

这是完全安全的。MyClass下面是一个实例被销毁时会发生的情况:

  1. MyClass的析构函数被调用(在你的例子中什么都不做)
  2. MyClass被破坏的所有成员变量。在您的情况下,QScopedPointer' 的析构函数被调用,这意味着孩子QObject被删除。当 aQObject被销毁时,它将从其父级的 children 列表中删除,因此父级不再尝试删除它QObject
  3. QObjectMyClass实例的析构函数被调用,它没有看到要删除的子级

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

于 2018-03-01T21:02:11.503 回答