记录一个崩溃crash的问题。
在方法中使用一个栈类对象时,程序出现崩溃。
原因是:
QT中 如果一个子级对象是new生成的(堆对象),当父级对象销毁时,会自动调用operator delete删除他的所有子级对象。
这样有三种情况:
- 如果一个子级对象是new生成的,他无需自己销毁;
- 如果一个子级对象不是new生成的(栈对象),他在父级对象销毁前自己主动销毁自己,没问题。
- 如果一个子级对象不是new生成的(栈对象),他不在父级对象销毁前自己主动销毁自己,父级对象调用operator delete他时就会出错(因为new的才能delete)。父对象可能有this->deletelater(); 触发!!!
(在Qt中,每个 QObject 内部都有一个list,用来保存所有的 children,还有一个指针,保存自己的parent。当它自己析构时,它会将自己从parent的列表中删除,并且析构掉所有的children。如以下QT源代码:)
QObject::~QObject()
{
//...
if (!d->children.isEmpty())
d->deleteChildren();
if (d->parent) // remove it from parent object
d->setParent_helper(0);
//...
}
void QObjectPrivate::deleteChildren()
{
Q_ASSERT_X(!isDeletingChildren, "QObjectPrivate::deleteChildren()", "isDeletingChildren already set, did this function recurse?");
isDeletingChildren = true;
// delete children objects
// don't use qDeleteAll as the destructor of the child might
// delete siblings
for (int i = 0; i < children.count(); ++i) {//销毁所有子对象
currentChildBeingDeleted = children.at(i);
children[i] = 0;
delete currentChildBeingDeleted;//非new生成的在此会出问题!!!
}
children.clear();
currentChildBeingDeleted = 0;
isDeletingChildren = false;
}
总结:所有QObject必须由operator new创建,或者必须在父级之前被销毁。