使用EXIT(0) 直接退出后,出现内存泄露情况


使用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);
	}
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清水迎朝阳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值