请教高手:使用AfxBeginThread创建线程,为什么在线程退出时会有内存泄漏?

realclimber 2005-08-16 11:57:51
我做了一个多线程的程序,结果线程退出时总是会出现内存泄露的问题,请各位高手指教:
经过跟踪发现:
_endthreadex(nExitCode); -》ExitThread(retcode);

在ExitThread时出现内存泄漏, 编译器提示如下:(VC7,windowsXP)

线程 '_threadstartex' (0xd0c) 已退出,返回值为 0 (0x0)。
aaa.DLL Terminating!
Detected memory leaks!
Dumping objects ->
{134} normal block at 0x00676A48, 84 bytes long.
Data: < cB qe qe qe > 20 63 42 00 E8 71 65 00 EE 71 65 00 EF 71 65 00
thrdcore.cpp(311) : {125} client block at 0x00676570, subtype c0, 68 bytes long.
a CWinThread object at $00676570, 68 bytes long
{124} normal block at 0x006764E8, 72 bytes long.
Data: <@bB > 40 62 42 00 00 00 00 00 01 00 00 00 01 00 00 00
Object dump complete.
线程 'Win32 线程' (0xa34) 已退出,返回值为 0 (0x0)。
...全文
420 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
realclimber 2005-08-17
  • 打赏
  • 举报
回复
问题已经找到,结帖!!
dirdirdir3 2005-08-16
  • 打赏
  • 举报
回复
退出线程时最好等线程自己退出。另外线程中有没有分配内存,检查一下。
亿云力科技 2005-08-16
  • 打赏
  • 举报
回复
mark
DentistryDoctor 2005-08-16
  • 打赏
  • 举报
回复
a CWinThread object at $00676570, 68 bytes long?
DentistryDoctor 2005-08-16
  • 打赏
  • 举报
回复
AfxBeginThread会创建一个CWiThread对象,删除它了么?

pThread->m_bAutoDelete==?,是否非正常结束的线程?
lixiaosan 2005-08-16
  • 打赏
  • 举报
回复
多半是数组越界,指针非法或者没有赋初值,指针用完要delete以及置NULL等
younggle 2005-08-16
  • 打赏
  • 举报
回复
退出的时候你要把该线程终止了。
WaitForSingleObject();
goodboyws 2005-08-16
  • 打赏
  • 举报
回复
这个问题好像被问过好多次了,我觉得是内存越界的问题
在处理消息时,定时刷新对话框画页信息 处理这个操作时有可能出现以下错误 1. 在DLG中点击开始,在线程中进行处理,并通过发送消息来更新DLG界面内容,如在线程中发送PostMessage,消息会排入消息队列等待所有线程处理循环后,即系统不忙了,才会去处理Post的消息刷新界面 所以要处理线程同时即时刷新界面要用SendMessage,它是一同步发送消息,会等处理完成才返回,即一SendMessage就会进入Refresh函数 2.而多线程函数的使用中可能出现以下问题,如果用 CWinThread * pthread=AfxBeginThread(……………); 并设一个全局变量flag=0; 在点击开始对应的START函数里开始线程后,用等待 While(flag!=1);//flag为当线程结束时设为1 来等待线程结束后,去处理 Delete pthread;//因为怕内在泄漏要手动delete 但此时会出现死锁现象,在DoMadal时,mainwnd会把消息处理队列处理转让给DLG来进行处理,当进入线程时,SendMessage,转到DLG窗口线程要进行处理,而此时窗口线程正一直在while(1)中,无法去处理SendMessage的消息,而UI线程又在等待着WORK线程的结束,但WORK线程此时正停滞等待SendMessage的回复,如此便造成了死锁现象 3.解决方法 而其实不用CWinthread去接收AfxBeginThread的返回值,并delete,此函数在线程结束时,会自动撤消线程的相关资源,所以不用用while(1)来等待线程的结束(见具体程序代码)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧