QT中的线程:在A线程RUN函数中new线程B,新的B线程运行完成以后,不执行析构函数,不delete,内存泄露

QT中的线程:在A线程RUN函数中new线程B,新的B线程运行完成之后,不执行析构函数,不delete,内存泄露
本帖最后由 xiaoxiaoa2 于 2014-07-19 16:43:21 编辑
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. 
引用
//将new Bthread这一步放到Athread的构造函数中,Bthread运行完后会自动释放,


你需要知道,Athread的构造函数 和 Athread 管理的线程没有必然关系!QThread 中除了被QThread::run()直接使用的成员函数外,其他成员(包括构造函数)都属于主线程。

当然,由于主线程有事件循环,你的deleteLater() 可以工作,(尽管不是你所期望的)。

2. 
引用
BThread *thread=new BThread();
connect(thread,SIGNAL(finished()),thread,SLOT(deletelater());


你需要知道,你的次线程没有启动事件循环,deleteLater() 是不可能被执行的。

3. 
引用
               thread.run();

此处,BThread 用法错误 

4. 看看这个吧,对你有帮助

http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/
------解决方案--------------------
要区分线程对象和线程,在 Qt 中,线程对象 QThread 所在线程和它所起的新线程,不是同一个线程。先理解这个概念,然后再谈其它。