1. 出现的问题
编写视频解码器程序时,把解码那部分单独置于一个线程中进行处理,后来实际应用到项目中发现内存泄漏很严重
问题就出现在多线程中,每次视频解码器程序关闭时首先必须释放其所涉及的堆空间,
由于Qt组件的堆空间一般是由其父组件直接进行管理的,但线程如果没有指定对应的父组件就必须自己手动处理;
2. 解决
直接在析构函数汇总增加如下代码
1 CameraClient::~CameraClient() 2 { 3 delete mPlayer; 4 mPlayer=NULL; 5 }
但是还是出错:
QThread: Destroyed while thread is still running
当出现这个问题时,说明子线程还在执行,但是主线程却退出了,所以需要加入一个线程停止标识,m_stop;通知子线程你要退出下了
1 volatile bool m_stop;
CameraClient::~CameraClient() { mPlayer->stopVideo(); delete mPlayer; mPlayer=NULL; }
void VideoPlayer::stopVideo() { m_stop=true; }
如果只是这样修改还是会报错,因为当m_stop=true;时有可能子线程还在执行,加上这句话唯一能确保的是下一次循环不执行,但此时主线程已经要退出了,子线程却还在执行
所以就要等到这个子线程这次结束后主线程退出,即需要执行子线程的wait函数subthread.wait();
完整的修改代码为:
1 CameraClient::~CameraClient() 2 { 3 mPlayer->stopVideo(); 4 mPlayer->wait(); 5 6 delete mPlayer; 7 mPlayer=NULL; 8 }