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