Qt中QObject *parent内存释放注意事项

问题的出现的原因是我们对Qt半自动的内存管理的理解不够
在Qt中,一些情况下,不需要我们手动删除new出来的对象:
QObject及其派生类的对象,如果其parent非0,那么其parent析构时会析构该对象。

Qt中引入对象树
这里写图片描述
当一个 QObject 对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。Qt 保证的是,任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的 children() 列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有 QObject 会被 delete 两次,这是由析构顺序决定的。

(1)对于堆对象(new出来的对象):
①QObject *parent或者QWidget *parent,当指定了parent后,Qt就会自动管理该对象的释放,不需要我们手动delete
②不指定parent时,需要手动delete。

(2)栈对象:
③栈是“先入后出,后入先出”的方式,因此在创建栈对象的时候,要注意顺序,举一个例子说明:

错误的情况:

#include "widget.h"
#include <QApplication>
#include <QPushButton>

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值