QT中的线程:在A线程RUN函数中new线程B,新的B线程运行完成以后,不执行析构函数,不delete,内存泄露
QT中的线程:在A线程RUN函数中new线程B,新的B线程运行完成之后,不执行析构函数,不delete,内存泄露
QT中的线程:在A线程RUN函数中new线程B,
新的B线程运行完成之后,不执行析构函数,不delete,内存泄露
请高手指点
------解决方案--------------------
短短的代码,问题可真不少。
1.
你需要知道,Athread的构造函数 和 Athread 管理的线程没有必然关系!QThread 中除了被QThread::run()直接使用的成员函数外,其他成员(包括构造函数)都属于主线程。
当然,由于主线程有事件循环,你的deleteLater() 可以工作,(尽管不是你所期望的)。
2.
你需要知道,你的次线程没有启动事件循环,deleteLater() 是不可能被执行的。
3.
此处,BThread 用法错误
4. 看看这个吧,对你有帮助
http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/
------解决方案--------------------
要区分线程对象和线程,在 Qt 中,线程对象 QThread 所在线程和它所起的新线程,不是同一个线程。先理解这个概念,然后再谈其它。
QT中的线程:在A线程RUN函数中new线程B,
新的B线程运行完成之后,不执行析构函数,不delete,内存泄露
请高手指点
calss AThread:public QThread{
public:
AThread(Qobject *parent);
run(){
BThread *thread=new BThread(); //将new Bthread这一步放到Athread的构造函数中,Bthread运行完后会自动释放,
//但是new对像是需要在运行过程中new出来的
connect(thread,SIGNAL(finished()),thread,SLOT(deletelater()); //不管加不加,thread这个线程执行完之后,都不会释放
thread.run();
}
}
calss BThread:public QThread{
public:
BThread(Qobject *parent);
~BThread();
run();
}
BThread:~BThread()
{
qDebug()<<"~BThread";
}
------解决方案--------------------
短短的代码,问题可真不少。
1.
你需要知道,Athread的构造函数 和 Athread 管理的线程没有必然关系!QThread 中除了被QThread::run()直接使用的成员函数外,其他成员(包括构造函数)都属于主线程。
当然,由于主线程有事件循环,你的deleteLater() 可以工作,(尽管不是你所期望的)。
2.
你需要知道,你的次线程没有启动事件循环,deleteLater() 是不可能被执行的。
3.
此处,BThread 用法错误
4. 看看这个吧,对你有帮助
http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/
------解决方案--------------------
要区分线程对象和线程,在 Qt 中,线程对象 QThread 所在线程和它所起的新线程,不是同一个线程。先理解这个概念,然后再谈其它。