关于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();来等待线程退出。