关闭程序后,子线程未正确退出引出的内存泄露问题

 

 

 

内存泄露信息如下:

 

 f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {239} normal block at 0x003AADA8, 46 bytes long.
 Data: <| Ox            > 7C D9 4F 78 0E 00 00 00 0E 00 00 00 01 00 00 00
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {237} normal block at 0x003AAD38, 48 bytes long.
 Data: <| Ox            > 7C D9 4F 78 0E 00 00 00 0F 00 00 00 01 00 00 00
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306) : {232} client block at 0x003AACB8, subtype c0, 68 bytes long.
a CWinThread object at $003AACB8, 68 bytes long

 

 

经查资料:

strcore.cpp   泄露  是由于CString 引起的

 

thrdcore.cpp  是由于线程未能正确退出引起的。

 

问题是,我仔细检查了cstring的使用 凡是 GetBuffer的地方 都release掉了 ,应该没问题了

 

那最主要因素还是线程的原因。

 

分析:

关闭对话框,此时执行对话框析构函数,在析构函数末尾,会强制关闭子线程函数。

问题就出现在这里了:

由于,子线程是强制关闭的, 所以子线程未执行完毕就被关闭了,因此,子线程所用到的资源未能及时释放,由此引起了内存泄露

 

解决方法:  在关闭主程序后,不要强制关闭子线程,而是让他也自动关闭

 

 

第一步: 建立全局变量

 

 

BOOL g_bIsValid=FALSE;    // 子线程循环条件

HANDLE g_hEvent=NULL;  // Event事件

 

 

第二步: 在创建线程前,创建一个无信号的event事件

 

g_hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

 

 

第三步: 设置子线程循环条件,并在循环结束后,设置EVENT事件

 

 while (g_bIsValid)
 {

     ...
 }

 SetEvent(g_hEvent);

 

第四步: 在主程序的析构函数中,修改g_bIsValid 并调用WaitForSingleObject(g_hEvent,INFINITE); 等待事件状态改变,而不是直接关闭程序。若事件状态改变 ,则意味 子线程函数跳出循环,可以正常退出

因此,若直接关闭程序,则子程序可能还没有正确退出,所以必须要调用WaitForSingleObject(g_hEvent,INFINITE); 以保证子线程正确退出

 

 g_bIsValid=FALSE;

 WaitForSingleObject(g_hEvent,INFINITE);
 CloseHandle(g_hEvent);

 

 

 

参考资料:

http://blog.csdn.net/linlianghui2004/article/details/3938693

 

 

 

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清水迎朝阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值