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继承的类,这使得它在这种情况下无用.我怎么能阻止这个?
这不是关于双重破坏.你不能删除堆栈对象.相反,您应该在堆中分配它:
Parent father;
Child* child = new Child();
father.addChild( child );
Run Code Online (Sandbox Code Playgroud)