很奇怪的问题 GetExitCodeThread 确定线程已经退出 线程还没实际退出 会出现内存泄露

mixdd 2010-02-12 05:39:55


if (::GetExitCodeThread (AllExitTread->m_hThread, &dwExitCode)&&dwExitCode != STILL_ACTIVE)
{
这里确定线程退出 终止整个程序
}



但是发现线程实际上还没退出 线程中的资源还没被释放 会出现内存泄露 谁知道是什么原因么?
...全文
224 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Allen_zhang 2010-02-21
  • 打赏
  • 举报
回复
你在线程中退出的时候打印一下日志不就知道线程是否真的退出了

最好还是用等待线程句柄的方法,然后通知线程自己退出
飞翔的土豆 2010-02-18
  • 打赏
  • 举报
回复
是不是调用了terminatethread()??这个API经常造成leak
ama1997 2010-02-16
  • 打赏
  • 举报
回复
if (::GetExitCodeThread (AllExitTread->m_hThread, &dwExitCode)&&dwExitCode != STILL_ACTIVE) 


另外,请把GetExitCodeThread放在if前面,搞不好就让if把语句也当做判断条件了。
ama1997 2010-02-16
  • 打赏
  • 举报
回复
《Inside Visual C++》至理名言:
使用全局变量让主线程和辅线程进行通讯最简便。

如果一定要释放,手动调用GlobalFree释放掉。
mixdd 2010-02-14
  • 打赏
  • 举报
回复
引用 3 楼 xsc2001 的回复:
线程退不通出和资源有没有释放没有关系的,如果你的线程里申请了内存就得在线程中释放,如果不释放退出线程也不会释放,只有整个进程退出了才会释放。


但是已经检测到线程退出了 为什么内存还没释放呢
arong1234 2010-02-14
  • 打赏
  • 举报
回复
这不可能!如果指向到return 但是do sth还没执行,这完全没有可能
出现这种判断的可能原因有两个:
1。你检测“do sth”是不是做了的方法有问题
2。你以为一定是通过return返回的,实际上线程不是通过这种方式退出的

这上面两个可能必俱其一,不可能跳过中间代码去执行return 0
引用 8 楼 mixdd 的回复:
使用return 0;退出的
没有动态申请的内存 new malloc

有谁知道是什么问题么

给线程发送wm_xxx
线程中代码是 peekmessage(...)
处理wm_xxx消息
do sth...
return 0;

然后GetExitCodeThread 检测 发现已经得到线程退出 !=still_alive 但是do sth...这步还没执行完毕
TANG_XIAO_BIN 2010-02-14
  • 打赏
  • 举报
回复
PostThreadMessage(PID,WM_QUIT,0,0);再试试!
mixdd 2010-02-14
  • 打赏
  • 举报
回复
使用return 0;退出的
没有动态申请的内存 new malloc

有谁知道是什么问题么

给线程发送wm_xxx
线程中代码是 peekmessage(...)
处理wm_xxx消息
do sth...
return 0;

然后GetExitCodeThread 检测 发现已经得到线程退出 !=still_alive 但是do sth...这步还没执行完毕
mixdd 2010-02-14
  • 打赏
  • 举报
回复
使用return 0;退出的
没有动态申请的内存 new malloc

有谁知道是什么问题么

给线程发送wm_xxx
线程中代码是 peekmessage(...)
处理wm_xxx消息
do sth...
return 0;

然后GetExitCodeThread 检测 发现已经得到线程退出的代码 但是do sth...这步还没执行完毕
arong1234 2010-02-14
  • 打赏
  • 举报
回复
即使你线程退出了,内存一样不会自动释放。除非你在线程退出前释放了所有内存,否则内存就是不会释放。尤其是你强制线程退出,实际上即使你写了内存释放代码,这些代码也不一定有机会退出
引用 4 楼 mixdd 的回复:
引用 3 楼 xsc2001 的回复:线程退不通出和资源有没有释放没有关系的,如果你的线程里申请了内存就得在线程中释放,如果不释放退出线程也不会释放,只有整个进程退出了才会释放。

但是已经检测到线程退出了 为什么内存还没释放呢
TANG_XIAO_BIN 2010-02-14
  • 打赏
  • 举报
回复
不会的,因为在操作系统里面都有系统线程的引用计数,当程序结束时,会自动释放资源,不会释放的是你自己动态分布的内存(new malloc等),但如果你调用了TerminateThread结束,那就不好说了!
建议你在创建完线程以后,马上BOOL CloseHandle(HANDLE hObject);,这样就可能会马上释放!
xsc2001 2010-02-13
  • 打赏
  • 举报
回复
线程退不通出和资源有没有释放没有关系的,如果你的线程里申请了内存就得在线程中释放,如果不释放退出线程也不会释放,只有整个进程退出了才会释放。
mixdd 2010-02-13
  • 打赏
  • 举报
回复
WaitForSingleObject 这个需要把m_bAutoDelete设置为false才可以截取到WAIT_OBJECT_0的

很麻烦 所以用了GetExitCodeThread


谁知道是什么问题么
mszjk 2010-02-13
  • 打赏
  • 举报
回复
WaitForSingleObject(hYourThreadHandle);
// thread over
// do your ths

15,472

社区成员

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

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