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