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 的实例被销毁时发生的情况:

  1. MyClass 的析构函数被调用(在您的示例中什么都不做)
  2. MyClass 的所有成员变量都被销毁。在你的例子中,QScopedPointer 的析构函数被调用,这意味着子 QObject 被删除。当一个 QObject 被销毁时它是 removed from its parent's list of children,所以父级不再试图删除这个 QObject
  3. QObjectMyClass 实例的析构函数被调用,它没有看到要删除的子项

如果没有理由动态分配您的子成员 QObject,您可能还想考虑按价值持有它