love in C++, live on MFC

to get ready...

C++博客 首页 新随笔 联系 聚合 管理
  47 Posts :: 0 Stories :: 97 Comments :: 0 Trackbacks

类似的问题见http://www.experts-exchange.com/Programming/Programming_Languages/MFC/Q_20084406.html

下面的代码,当用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函数只能侥幸的保证线程退出,但不能确保。
posted on 2006-07-26 19:11 flyingxu 阅读(3391) 评论(3)  编辑 收藏 引用 所属分类: VC/MFCBug of Today

Feedback

# re: Memory leak in CWinThread? 2006-08-10 23:18 flyingxu
今天又试了一下,发现恰当的应该是:
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  回复  更多评论
  

# re: Memory leak in CWinThread? 2007-09-07 12:42 FLHang
感谢作者的文章, 不过我对有一个地方有点疑惑, 是否需要进行如下改进???
m_pMonitorThread = AfxBeginThread(MonitorThread, (LPVOID)this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
m_pMonitorThread->m_bAutoDelete = FALSE;
m_pMonitorThread->ResumeThread();

个人觉得应该先用CREATE_SUSPENDED启动线程, 再设置bAutoDelete , 最后再ResumeThread. 否则, 有极端的情况下, AfxBeginThread启动的线程已经退出. WaitForSingleObject将不能正确取处m_hThread句柄.

qq:16182038  回复  更多评论
  

# re: Memory leak in CWinThread?[未登录] 2007-09-07 15:31 flyingxu
@FLHang
你说的有道理  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理