如何使用智能指针防止双重对象删除?

use*_*463 -1 c++ qt pointers memory-management smart-pointers

我有一个课程,它拥有它的孩子的所有权:

class Child
{
public:
    Child() {}
    ~Child() {}
};

class Parent : public QObject
{
    Q_OBJECT
public:
    explicit Parent(QObject *parent = 0): QObject(parent) {}
    ~Parent()
    {
        qDeleteAll(m_children);
    }
    void addChild(Child *ch)
    {
        m_children.append(ch);
    }    
private:
    QList<Child *> m_children;    
};
Run Code Online (Sandbox Code Playgroud)

Child删除后,Parent使用addChild方法添加到类中的实例将Parent被删除.

以下使用将导致双子女破坏:

int main()
{
    {
        Parent father;
        Child child;
        father.addChild( &child );
    }
    //child is out of scope now and gets destroyed
    //father gets destroyed too
    //father's destructor deletes child AGAIN!
    //crash!
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如何通过使用智能指针来防止这种情况?QPointer可用于QObject继承的类,这使得它在这种情况下无用.我怎么能阻止这个?

wuq*_*ang 5

这不是关于双重破坏.你不能删除堆栈对象.相反,您应该在堆中分配它:

Parent father;
Child* child = new Child();
father.addChild( child );
Run Code Online (Sandbox Code Playgroud)