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