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

dte*_*ech 8 c++ qt memory-management undefined-behavior qobject

根据Qt文档:

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

对于我来说,这意味着当一个QObject被删除时,它会通过并在它存储在子列表中的所有指针上调用delete.

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

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

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

那么,QObject在删除时是否区分堆栈和堆分配子项?如果是这样,究竟是怎么回事?

And*_*ter 10

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

不.请参阅QObject :: ~QObject():

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

  • 是的,应该先查看析构函数然后再询问... 10x (2认同)