以前用vc++6.0写的一个程序现在用vs2005运行出现大量的类似下面的内存泄露问题。
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {33188} normal block at 0x0189A7F0, 29 bytes long.
 Data: <  >x            > EC 97 3E 78 0C 00 00 00 0C 00 00 00 01 00 00 00 
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {33187} normal block at 0x0189A798, 23 bytes long.
 Data: <  >x            > EC 97 3E 78 06 00 00 00 06 00 00 00 01 00 00 00 
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {33186} normal block at 0x0189A738, 29 bytes long.
 Data: <  >x            > EC 97 3E 78 0C 00 00 00 0C 00 00 00 01 00 00 00 
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {33185} normal block at 0x01891BD8, 25 bytes long.
 Data: <  >x            > EC 97 3E 78 08 00 00 00 08 00 00 00 01 00 00 00 
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {33184} normal block at 0x01891B78, 29 bytes long.
 Data: <  >x            > EC 97 3E 78 0C 00 00 00 0C 00 00 00 01 00 00 00 
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {33183} normal block at 0x01890408, 23 bytes long.
 Data: <  >x            > EC 97 3E 78 06 00 00 00 06 00 00 00 01 00 00 00 
   
程序里用到很多CString和CStringArray类型的数据,new和delete也是配套的,就几处用到GDI对象也都释放了资源,查网上资料说是由CString引起的,难道我要把所有的CString和CStringArray类型数据替换掉,可是这样的数据太多了呀,大家有没有好的办法。

解决方案 »

  1.   

    你看看,是不是所有的cpp文件都有:
    #ifdef _DEBUG
    #define new DEBUG_NEW
    、没有这个宏定义的,加上!基本可以直接看到了!
      

  2.   

    没遇到过,如果真是CString之类的问题,倒是可以用个宏定义替换一下,比如
    #define CString int
    你原有的CString定义的变量,如:CString name;,就不用改了。
    不知道可行否。
      

  3.   


    你贴出来的里面给出的.cpp的line 141 处发生内存泄露,这里分配的内存没释放,
    看看后面是不是有分支语句 , 只把一部分释放了。VS2005是处理内存泄漏比较简单的了。
      

  4.   

    http://blog.csdn.net/robertbaker/article/details/6362012_CrtSetBreakAlloc   在给定的分配数目上分配断点,每一块被分配的内存都被指派一个连续的分配号。(查找特定的内存泄露十分有用)
      

  5.   

    RobertBaker,>我在程序中加了_CrtSetBreakAlloc(33050);这句,程序运行时停在dbgheap.c文件中, 堆栈信息:msvcr80d.dll!_heap_alloc_dbg(unsigned int nSize=0x0000001d, int nBlockUse=0x00000001, const char * szFileName=0x781d4d44, int nLine=0x0000008d)  Line 369 C++
       这是不是说明是有申请的堆栈没有释放呢??
      

  6.   

    CString和CStringArray不会导致内存泄漏
    搜 new 和 delete 关键词,是否完全配对
      

  7.   

    CString大小受内存限制,在内存够的情况下一直增加,如果不清空的话CPU利用率会很高,至于泄不泄露你测试一下看看
      

  8.   

    void CPolygon::SetPolygonColor(CString str1)
    {
    int type;
    if(str1=="131k")
    {
    m_PolygonColor=RGB(63,118,100);   
    m_Property="可调整有林地";
    }
    if(str1=="121k")
    {
    m_PolygonColor=RGB(138,199,133);   
    m_Property="可调整果园";
    }
    if(str1=="136k")
    {
    m_PolygonColor=RGB(119,152,73);   
    m_Property="可调整苗圃";
    }
    else
    {
    type=atoi(str1);
    switch(type)  
    {
    case 201:
    m_PolygonColor=RGB(108,109,101);   
    m_Property="城市";
    break;
    case 114:
    m_PolygonColor=RGB(142,147,85);   
    m_Property="旱地";
    break;
    case 321:
    m_PolygonColor=RGB(56,141,69);   
    m_Property="河流水面";
    break;
    case 262:
    m_PolygonColor=RGB(85,98,83);   
    m_Property="公路用地";
    break;
    case 121:
    m_PolygonColor=RGB(158,194,84);   
    m_Property="果园";
    break;
    case 136:
    m_PolygonColor=RGB(117,215,124);   
    m_Property="苗圃";
    break;
    case 113:
    m_PolygonColor=RGB(91,126,78);   
    m_Property="水浇地";
    break;
    case 317:
    m_PolygonColor=RGB(115,119,113);    
    m_Property="其他未利用土地";
    break;
    case 131:
    m_PolygonColor=RGB(48,184,58);   
    m_Property="有林地";
    break;
    case 203:
    m_PolygonColor=RGB(83,134,149);   
    m_Property="农村居民地";
    break;
    case 156:
    m_PolygonColor=RGB(79,153,98);   
    m_Property="农田水利用地";
    break;
    case 323:
    m_PolygonColor=RGB(167,167,65);   
    m_Property="苇地";
    break;
    case 154:
    m_PolygonColor=RGB(151,207,137);   
                    m_Property="坑塘水面";
    break;
    case 151:
           m_PolygonColor=RGB(176,182,158);    
    m_Property="畜禽饲养地";
    break;
    case 314:
    m_PolygonColor=RGB(190,194,137);   
    m_Property="沙地";
    break;
    case 115:
    m_PolygonColor=RGB(120,209,120);   
    m_Property="菜地";
    break;
    case 155:
    m_PolygonColor=RGB(181,158,98);   
    m_Property="养殖水面";
    break;
    case 157:
    m_PolygonColor=RGB(112,169,173);   
    m_Property="田坎";
    break;
     case 111:
    m_PolygonColor=RGB(130,196,181);   
    m_Property="灌溉水田";
    break;
    case 261:
    m_PolygonColor=RGB(102,72,80);   
    m_Property="铁路用地";
    break;
    default:
    break;
    }
    }
    其中m_PolygonColor是COLORREF类型数据,m_Property是CString类型数据。
    问题就出在这一段代码上,当我把这段代码注释掉后,就不会有内存泄露提示,不明白这段程序为什么会有泄露,请高手指点...............
      

  9.   

    m_PolygonColor,m_Property是怎么声明的
      

  10.   

    网上的说法,你可以参考一下
    在VC++6中,CString 的拷贝构造函数没有使用内存分配,而是使用的引用,它内部保存了一个引用的计数器
    比如:
    CString str1="aaa";
    CString str2=str1;   //注意,这时候str2并没有调用 new ,而是使用str1的引用同时,str1中保存的引用记数++
    str2="abcd1234";     //好了,现在str2才分配内存,str1引用记数--。这同时也是为什么str2.Empty()就没有内存泄露的原因。因为str1的引用记数也--了。另外,它分配内存的方法是4字节对齐的64字节的倍数+sizeof(内部结构)(超过64的时候)。在多数情况下,比较简单的使用过程中,MFC的这个BUG不会发作,也就是不会有内存泄露。那什么时候CString会暴露出BUG那?
    我以前出现错误的经验是:如果多次调用带有CString引用的参数的函数(形如:funstr(CString &str);这样的函数),在一定的时候(和字符串长度有关系),CString的内部引用记数器发生记数混乱,造成内存泄露。
      

  11.   

    一个笨办法:所有new和delete的地方打日志输出指针,对比。
      

  12.   

    echoyin59,这两个变量,是我自己定义的CPolygon类的成员变量
          COLORREF m_PolygonColor;//私有成员变量
          CString m_Property;//公有成员变量
    在构造函数里已经初始化
           m_PolygonColor=RGB(255,255,255);
          m_Property="";
      

  13.   

    你每次调用这个函数的时候把CString m_Property;清空试试
      

  14.   

    谢谢大家的热心,尤其是echoyin59,受大家启发,我不用CString做参数,问题解决了,看来以后要慎用CString了。