AfxBeginThread引起的記憶體流失

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.