qt关于delete堆注意事项以及多线程的使用

在Qt编程时,如果一个对象是另一个对象的父对象,删除父对象会自动删除所有子对象。尝试单独删除已由父对象删除的子对象会导致错误。解决方法是避免重复删除或顺序删除。Qt实现多线程可以继承QThread并重写run,使用moveToThread或将函数通过QtConcurrent运行在新线程中,但需注意线程同步和对象所有权问题。
摘要由CSDN通过智能技术生成

关于delete对象的注意事项

这次写项目的时候,碰到了一个关于delete对象的小问题,记录下。
在一次new了两个对象的情况下,将一个对象设置父对象为另一个对象,删除对象,会出现删除对象的错误异常,简略代码如下:

QPushButton *b = new QPushButtom();
QWidget *w = new QWidget();
b->setparent(w);
...
...
delete w;
delete b;	

在qt中,当一个对象被另一个对象收为子对象时,该父对象会有一个子对象树,当删除该父对象时,会先遍历一一遍父对象的对象树,先将对象树中的所有子对象删除,再删除父对象,上述代码中,先删除了父对象,在这个步骤中便已经删除了子对象,第二次调用删除子对象的时候便会出错,对象的堆不能重复删除。,解决办法就是要么不设置父对象一一删除,要么只删除父对象。
在删除对象分配的空间时,一定要注意不能多次删除。

多线程的使用补充

qt是实现多线程主要有三种办法。
一是直接继承QThread类,重写run函数,对该线程对象来说,只有run函数是处在子线程中的。
二是使用movetothread函数,将当前对象与其子对象移动到新线程中。示例代码如下:

QThread *thread = new QThread();//创建线程
this->moveToThread(thread); //将this对象移动到thread线程中
thread->start(); //启动线程

根据官方文档的描述,moveToThread函数是将该对象以及子对象移动到子线程中,但是,该对象与子对象又是在主线程中创建的,所以说对象本身是属于主线程的,想要在子线程中运行对象函数,必须通过信号槽的方式调用该函数。同时,移动对象到线程中时,该对象不能是其他对象的子对象,因为对象所处线程必须和父对象一致,有父对象的对象不能被移动。
三是使用QFuture来实现子线程。示例代码如下:


#include <QtConcurrent/QtConcurrentRun>
QFuture<void> res = QtConcurrent::run(function);

function是需要在线程运行的函数,res是返回值,可用可不用。一般用来在析构函数调用res…waitForFinished();来等待线程退出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值