android hal层内存泄漏,MFC程序退出后,出现内存泄露原因之一

使用EXIT(0) 退出程序时,跳出以下内存泄露信息:

Detected memory leaks!

Dumping objects ->

f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {178} normal block at 0x003DA9B0, 36 bytes long.

Data: < 9Px            > AC 39 50 78 09 00 00 00 09 00 00 00 01 00 00 00

f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {177} normal block at 0x003DA900, 110 bytes long.

Data: < 9Px.   .       > AC 39 50 78 2E 00 00 00 2E 00 00 00 01 00 00 00

Object dump complete.

二者都是字符串问题 ,猜测是由于CString引起的

但是为什么CString会引起呢?

源程序如下:

{

CString setPath=L"f:\\";

g_strIP=L"127.0.0.1";

CLoginDlg dlg;

dlg.m_strIP = g_strIP;  // m_strIP是dlg的CString变量     g_strIP是全局CString变量

if (dlg.DoModal()==IDOK)

{

g_strIP = dlg.m_strIP;

}

else

{

exit(0);

}

}

分析:

此段程序有两个局部变量

CString setPath

CLoginDlg dlg;

及一个全局变量CString  g_strIP

其中局部变量dlg中,包含字符串变量  dlg.m_strIP

CSting 在堆上开辟空间  默认情况下,出了作用域后,CString对象是自动撤销的。

但是,由于使用了EXIT(0) ,强行退出这段作用域, 因此在这段作用域中使用的CString对象没有得到释放,故而出现了内存泄露情况。

而全局CString对象则不受此影响,在EXIT(0) 退出函数中,会自动释放全局CString

因此,导致内存泄露的元凶即为 作用域之内的CString局部变量。  既然不能自动撤销,那只好人为撤销了,在强行退出前,添加CString撤销语句即可消除内存泄露。

修改后的程序如下:

{

CString setPath=L"f:\\";

g_strIP=L"127.0.0.1";

CLoginDlg dlg;

dlg.m_strIP = g_strIP;  // m_strIP是dlg的CString变量     g_strIP是全局CString变量

if (dlg.DoModal()==IDOK)

{

g_strIP = dlg.m_strIP;

}

else

{

dlg.m_strIP.Empty();  //撤销局部CSTRING对象

setPath.Empty();

exit(0);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值