多线程退出,内存泄漏

liyw2005 2013-09-18 03:59:21
本项目是多线程处理的,正常退出(用控件控制停止向线程往界面报告状态,然后把再点击关闭)是没有问题的。如果其他线程还一直在向界面报告状态(GetItemText、SetItemText)的话,此时点击右上角的关闭,就会造成内存泄漏。
  现在我测试了一下,发现往界面报告状态的线程无法退出(停在GetItemText、SetItemText函数上),我重写了OnClose,在里面等待其他线程执行完退出,但一直没能退出。
:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278780} normal block at 0x02AC4428, 273 bytes long.
Data: <T vQ > 54 CD 76 51 02 00 00 00 00 01 00 00 01 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278774} normal block at 0x02AC43D8, 20 bytes long.
Data: <T vQ > 54 CD 76 51 03 00 00 00 03 00 00 00 01 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278771} normal block at 0x02AC4380, 21 bytes long.
Data: <T vQ > 54 CD 76 51 04 00 00 00 04 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278770} normal block at 0x02AC4330, 19 bytes long.
Data: <T vQ > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278769} normal block at 0x02AC42E0, 19 bytes long.
Data: <T vQ > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278768} normal block at 0x02AC4290, 19 bytes long.
Data: <T vQ > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278767} normal block at 0x02AC4240, 19 bytes long.
Data: <T vQ > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278766} normal block at 0x02AC41F0, 19 bytes long.
Data: <T vQ > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278765} normal block at 0x02AC41A0, 19 bytes long.
Data: <T vQ > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278764} normal block at 0x02AC4150, 19 bytes long.
Data: <T vQ > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278763} normal block at 0x02AC4100, 19 bytes long.
Data: <T vQ > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278762} normal block at 0x02AC40B0, 20 bytes long.
Data: <T vQ > 54 CD 76 51 03 00 00 00 03 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278761} normal block at 0x02AC4060, 18 bytes long.
Data: <T vQ > 54 CD 76 51 01 00 00 00 01 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278760} normal block at 0x02AC3F60, 23 bytes long.
Data: <T vQ > 54 CD 76 51 06 00 00 00 06 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278759} normal block at 0x02AC3F10, 19 bytes long.
Data: <T vQ > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(188) : {278758} normal block at 0x02AC4000, 30 bytes long.
Data: <T vQ > 54 CD 76 51 0C 00 00 00 0D 00 00 00 03 00 00 00
{838} client block at 0x001DE180, subtype c0, 212 bytes long.

点击了右上角的关闭之后,主线程是怎样处理的呢?为什么用GetItemText、SetItemText都执行不了,无法继续下去。
我应该怎样解决这个问题呢?
...全文
1967 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongfangbuba 2016-04-07
  • 打赏
  • 举报
回复
引用 3 楼 rtdb 的回复:
点击右上角的关闭,会导致UI先关闭,所以GetItemText、SetItemText这些UI操作就无效了。 主线程加多一个退出标志吧,在UI的Onclosing时置位, 其他线程访问UI时先判断此标志。
顶!d=====( ̄▽ ̄*)b XX掉之前关闭所有线程;清空所有内存
害羞的大叔 2016-02-18
  • 打赏
  • 举报
回复
environment.exit(0)
liquoryellow 2016-02-18
  • 打赏
  • 举报
回复
第一,上面都说了,加标记退出线程。 第二,看哪个变量内存没清掉,把其内存清除一下。
  • 打赏
  • 举报
回复
写个bool变量。bool bThreadBusy; 线程一进去。=true; 线程返回的函数= false; 任何关闭之前要么结束线程。要么判断是是否为false了。如果不是。弹出框请等待。什么时候结束什么时候才能关闭啊。
chinacoding 2014-03-01
  • 打赏
  • 举报
回复
exit process 重新编辑如下,更方便发现内存泄漏的地方。 /*在进程结束的地方调用该接口,就可以发现内存泄漏的地方。 显现就是发现某地方分配的内存没有被释放掉,或者是释放的逻辑存在疏漏。 */ void exit_process() { if (map_a.empty()) reeturn; for (i = 0; i < map_a.size(); i++){ a = map[i]; OutputDebugString(_T("文件{%s}行{%d}处分配的内存{0x%x}存在内存泄漏,因为没有发现释放该缓存的地方"), a.file, a.line, a.ptr); } }
chinacoding 2014-03-01
  • 打赏
  • 举报
回复
void* operator new (int size, const char* file, int line) { void* a = ::malloc(size); assert (a == NULL); map_a[a] = file + line; } #define new(size) new(size, __FILE__, __LINE__) void operator delete(void* a) { map_a.erase(a); free(a); } #define delete delete /*在进程结束的地方调用该接口,就可以发现内存泄漏的地方。 显现就是发现某地方分配的内存没有被释放掉,或者是释放的逻辑存在疏漏。 */ void exit_process() { if (map_a.empty()) reeturn; for (i = 0; i < map_a.size(); i++){ a = map[i]; OutputDebugString(_T("文件{%s}分配的内存{0x%x}存在内存泄漏,因为没有发现释放该缓存的地方"), a.file, a.p); } } 对应的msdn中有类似的重载,我只不过是按原理给你写了一个。
ww285705191 2014-02-27
  • 打赏
  • 举报
回复
三楼正解,lz给线程增加一个标识用于判断,以实现程序关闭前的线程终止
chinacoding 2014-02-26
  • 打赏
  • 举报
回复
按照csdn的文档,debug状态下重载new/delete,就可以直接插到内存泄露位置。
hhhh63 2014-01-02
  • 打赏
  • 举报
回复
处理“点击右上角的关闭”事件,好象是在onclose事件,先结束所用线程,再退出。
xiaoyuan402 2014-01-02
  • 打赏
  • 举报
回复
这个应该是有些资源完全没有释放吧,先把所有的线程全部释放掉在关闭。
lude8880 2013-12-23
  • 打赏
  • 举报
回复
try catch 这够损的。
相思梦 2013-12-22
  • 打赏
  • 举报
回复
加断电到程序段, 不然你可以用 逐行调试 随时观看,局部变量,和输出 重的值 如果实在不可以解决可以用c++ try{}catch(...){}错误处理屏蔽试试
lude8880 2013-12-14
  • 打赏
  • 举报
回复
在点击关闭的地方加个断点。实在不行观察当时计算机所有程序。
Cesar-Wu 2013-11-15
  • 打赏
  • 举报
回复
请问楼主问题解决了么?我现在也是这个问题。
yaohuang306 2013-10-16
  • 打赏
  • 举报
回复
Mark 有内存泄漏软件,但是我也用不好
我的波塞冬 2013-10-16
  • 打赏
  • 举报
回复
有些内存泄露能避免,有些不能。
橘色的喵 2013-09-27
  • 打赏
  • 举报
回复
我也经常遇到,mark
rtdb 2013-09-23
  • 打赏
  • 举报
回复
点击右上角的关闭,会导致UI先关闭,所以GetItemText、SetItemText这些UI操作就无效了。 主线程加多一个退出标志吧,在UI的Onclosing时置位, 其他线程访问UI时先判断此标志。
liyw2005 2013-09-22
  • 打赏
  • 举报
回复
引用 1 楼 rtdb 的回复:
若确认是退出时的内存泄漏,那没关系的, 反正程序一退出,所用内存系统会全部回收的。
虽然说这个问题也不大,但总是一个缺陷,需要找解决方法的
rtdb 2013-09-18
  • 打赏
  • 举报
回复
若确认是退出时的内存泄漏,那没关系的, 反正程序一退出,所用内存系统会全部回收的。

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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