根据Qt文档:
QObjects 在对象树中组织自己。当您创建一个 QObject 以另一个对象作为父对象,该对象将自动 将自身添加到父级的 Children() 列表中。父母拥有所有权 物体的;即,它会自动删除其子项 析构函数。
对我来说,这意味着当删除 QObject 时,它会遍历并调用它存储在其子列表中的所有指针的删除。
但是,子级没有必要动态分配,并且使用堆栈分配的对象构建 QObject 树是完全合法的。
根据标准规范,在不指向动态分配对象的指针上调用delete是未定义的行为,这可能会导致从“无”到程序崩溃的任何结果。
在我看来,QObject 不太可能依赖于可能产生未定义行为的东西,因为它几乎是整个 Qt 类集合的支柱。
那么,QObject 在删除时区分堆栈分配的子项和堆分配的子项吗?如果是这样,具体是怎样的?
但是,children 没有必要动态分配, 使用分配的堆栈构建 QObject 树是完全合法的 物体。
不。参见 QObject::~QObject():
警告: 所有子对象都将被删除。如果这些对象中有任何一个打开 堆栈或全局,你的程序迟早会崩溃。