使用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.orm
两者都是字符串问题 ,猜想是因为CString引发的对象
可是为何CString会引发呢?ip
源程序以下:内存
{
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);
}
}作用域
分析:字符串
此段程序有两个局部变量it
CString setPath
CLoginDlg dlg;
及一个全局变量CString g_strIP
其中局部变量dlg中,包含字符串变量 dlg.m_strIP变量
CSting 在堆上开辟空间 默认状况下,出了做用域后,CString对象是自动撤销的。object
可是,因为使用了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); } }