【发布时间】:2023-03-04 21:28:01
【问题描述】:
我有一个类拥有它的孩子的所有权:
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;
};
当Parent 被删除时,使用addChild 方法添加到Parent 类的Child 实例将被删除。
以下用法会导致双子销毁:
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;
}
如何通过使用智能指针来防止这种情况? QPointer 可用于 QObject 继承的类,这使得它在这种情况下毫无用处。我还能如何防止这种情况发生?
【问题讨论】:
-
设计——这是对大多数终身问题的答案。对象的生命周期和所有权是设计的基本部分。
-
能否请您为
Parent和Child课程提供设计建议。请记住,Parent类应该允许在我的设计中修改子项,例如添加、删除、编辑Parent类也有一个返回m_children的方法。 -
wuqiang 提供了一种可能是最简单的方法,不传递所有权是另一种方法(传递引用,内部复制)——尽管没有什么是真正的万无一失,但永远不要低估愚蠢的力量.
标签: c++ qt pointers memory-management smart-pointers