8

根据 Qt 文档:

QObjects 在对象树中组织自己。当您以另一个对象作为父对象创建 QObject 时,该对象将自动将自身添加到父对象的 children() 列表中。父级获得对象的所有权;即,它将自动删除其析构函数中的子级。

对我来说,这意味着当 QObject 被删除时,它会遍历并调用它存储在其子列表中的所有指针的 delete。

然而,子节点没有必要被动态分配,使用堆栈分配的对象构建 QObject 树是完全合法的。

根据标准规范,对不指向动态分配对象的指针调用 delete 是未定义的行为,这可能导致从“无”到程序崩溃的任何事情。

IMO 不太可能 QObject,它几乎是整个 Qt 类集合的支柱,依赖于可能产生未定义行为的东西。

那么,QObject 在删除时是否区分栈和堆分配的孩子呢?如果是这样,究竟如何?

4

1 回答 1

11

然而,子节点没有必要被动态分配,使用堆栈分配的对象构建 QObject 树是完全合法的。

不。见QObject::~QObject()

警告:所有子对象都被删除。如果这些对象中的任何一个在堆栈上或全局上,那么您的程序迟早会崩溃。

于 2012-09-20T13:52:56.360 回答