QObject 在删除时是否区分堆栈和堆分配的子级?

问题描述 投票:0回答:1

根据Qt文档:

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

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

但是,子级没有必要动态分配,并且使用堆栈分配的对象构建 QObject 树是完全合法的。

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

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

那么,QObject 在删除时区分堆栈分配的子项和堆分配的子项吗?如果是这样,具体是怎样的?

c++ qt memory-management undefined-behavior qobject
1个回答
12
投票

但是,children 没有必要动态分配, 使用分配的堆栈构建 QObject 树是完全合法的 物体。

不。参见 QObject::~QObject():

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

© www.soinside.com 2019 - 2024. All rights reserved.