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.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);     } }

相關文章
相關標籤/搜索