Qt代码为什么只需要new而不需要delete

Qt代码为什么只需要new而不需要delete,第1张

QT的父子对象机制是在 QWidget和QOject中实现的。当我们使用父对象来创建一个对象的时候 ,父对象会把这个对象添加到自己的子对象列表中。当这个父对象被删除的时候,它会遍历它的子对象类表并且删除每一个子对象,然后子对象们自己再删除它们自己的子对象,这样递归调用直到所有对象都被删除。

这种父子对象机制会在很大程度上简化我们的内存管理工作,减少内存泄露的风险。我们需要显试删除(就是用DELETE删除)的对象是那些使用NEW创建的并且没有父对象的对象(切记是new的才要delete,通过成员函数获得的对象,没有特殊说明的,千万不要随便delete.)。如果我们在删除一个对象的父对象之前删除它,QT会自动地从它的父对象的子对象列表中移除它的。

意思是说,重定义父对象。

如何重定义呢?看parent参数。

当PaintWidget放到某个窗口上的时候,该PaintWidget的父对象就被重定义为该窗口。

但是,由于PaintWidget本身继承于QWidget,那么还需要对QWidget的父对象重定义。PaintWidget通过parent指针来告诉父类QWidget:“我的父对象是该窗口,请把你的父对象也置为那个窗口”。

就是这样。。。

请注意区分父类和父对象的区别。

一、Qt的半自动化的内存管理

(1)QObject及其派生类的对象,如果其parent非0,那么其parent析构时会析构该对象。

(2)QWidget及其派生类的对象,可以设置 Qt::WA_DeleteOnClose 标志位(当close时会析构该对象)。

(3)QAbstractAnimation派生类的对象,可以设置 QAbstractAnimation::DeleteWhenStopped。

(4)QRunnable::setAutoDelete()、MediaSource::setAutoDelete()。

(5)父子关系:父对象、子对象、父子关系。这是Qt中所特有的,与类的继承关系无关,传递参数是与parent有关(基类、派生类,或父类、子类,这是对于派生体系来说的,与parent无关)。

//参考 https://blog.csdn.net/qq_42100881/article/details/80447441

二、布局、tabwiget 、tablewidget 、tableView  treeview treeWidget添加控件需要自己手动释放不

1、布局 

mywidget* pp = new mywidget

ui->verticalLayout->addWidget(pp)//verticalLayout 为主窗口 ui中的布局

测试:关闭主窗口, mywidget 的析构函数会自动进入

2、tabwiget 

mywidget* pTest = new mywidget//其中没有设置setAttribute(Qt::WA_DeleteOnClose)

 ui->tabWidget->addTab(pTest, "test")

测试:关闭主窗口, mywidget 的析构函数会自动进入  

3、tablewidget

ui->tableWidget->setRowCount(2)//设置行数为2

ui->tableWidget->setColumnCount(2)//设置列数为5

myQComboBox* combox = new myQComboBox//myQComboBox自己继承QComboBox的 没有指定父亲,

ui->tableWidget->setCellWidget(0,0,combox)

测试:关闭主窗口, myQComboBox 的析构函数会自动进入  

4、tableView


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11950065.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存