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

相关文章
相关标签/搜索