AfxBeginThread引起的内存泄漏

AfxBeginThread引起的内存泄漏(ZZ)

下面的代码,当用AfxBeginThread开始一个线程时,实际上是有内存泄漏的

for  (ii  =   0 ; ii  <   1000 ; ii ++ ) 
{
  CWinThread  * pWinThread; 
  pWinThread  =  AfxBeginThread(ThreadLBProc, NULL);
  ::Sleep( 500 );
}

UINT ThreadLBProc(LPVOID pParam)
{
   return   0 ;

VC输出的典型提示为:
Detected memory leaks!
Dumping objects ->
thrdcore.cpp(166) : {782} client block at 0x00425300, subtype 0, 112 bytes long.
实际上,只要看到是thrdcore.cpp(166) 的内存泄漏,基本就是同一个原因,和上面的代码一样。
解决方法:
step 1)
在线程函数中,记得写AfxEndThread();(与AfxBeginThread对应,其他的开始线程的函数,有相应的函数)
step 2)
用::WaitForSingleObject()确保线程彻底退出

step 2是比较容易忽略的,用sleep函数只能侥幸的保证线程退出,但不能确保。


今天又试了一下,发现恰当的应该是: 
AfxBeginThread -> CreateThread ->_beginthreadex -> _AfxThreadEntry 
而在_AfxThreadEntry中,会保证AfxEndThread会调用,这个时候,如果 
pWinThread->m_bAutoDelete == TRUE, 整个pWinThread会delete掉,pWinThread->m_hThread也就自然不是个有意义的值。 
所以: 
//code 1: 
//remember pWinThread for later use 
m_pWinThread = AfxBeginThread(ThreadLBProc, NULL); 
//不要自动删掉m_WinThread,保证pWinThread->m_hThread可用 
m_WinThread->m_bAutoDelete = FALSE;

//code 2 
WaitForSingleObject(pWinThread->m_hThread, INFINITE) 
delete pWinThread;//在使用完pWinThread->m_hThread后,再手工delete

你應該使用WaitSingleObject(線程句柄)來等待線程退出,而不應用sleep.
另外,你的線程是使用循環測試stoploop=false來控制線程的退出嗎? 如果這樣的話,你應把stoploop變量聲明前加上 volatile 標志。要不然优化程序會將你的stoploop改為寄存器變量,這樣,不管你如何在主線程中改變stoploop, 子線程中的stoploop始終會為false。你的線程也就...不會結束了。

 来源:http://chenlan511.blog.163.com/blog/static/17053221320109213452748

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值