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