.h 文件
CStringArray *mPage_list_item;
.cpp构造函数里面
this->mPage_item_path=new CStringArray;
析构函数
this->mPage_item_path->RemoveAll();
this->mPage_item_path->FreeExtra();
for(int i=0;i<this->mPage_item_path->GetSize();i++)
{
this->mPage_item_path->ElementAt(i).ReleaseBuffer();
} {
delete mPage_item_path;
this->mPage_item_path=NULL;
}
各位请讲解下

解决方案 »

  1.   

    头文件里是mPage_list_item,源文件里怎么是mPage_item_path?这两个有什么关系?析构里面直接delete mPage_item_path即可,CStringArray有自己的析构,CStringArray中的CString也有自己的析构,没明白你为什么这么做,为什么产生了内存泄漏。
      

  2.   

    你的内存泄露是否可以看到是那地方造成的?如果看不到,加define _DEBUG那些宏在CPP中,如果还是看不到,判断泄露的大小猜测是什么泄露。
      

  3.   

    _CrtDumpMemoryLeaks()
    检测下是什么地方泄漏了内存
    不一定是这个地方有泄漏
      

  4.   

    还可以用stl的模板list等..
    自己还可以用工具检查一下泄漏在什么地方
      

  5.   

    不要随便怀疑MFC  MFC对你来说 只是个传说
      

  6.   

    CStringArray很好用的,搂住没用好吧
      

  7.   

    this->mPage_item_path->RemoveAll();//你移除了所有的元素
    this->mPage_item_path->FreeExtra(); for(int i=0;i<this->mPage_item_path->GetSize();i++)//这里GetSize应该为0了不是么?
    {
        this->mPage_item_path->ElementAt(i).ReleaseBuffer();//这里还会进来吗?按楼主的思想?
    }{
         delete mPage_item_path;
         this->mPage_item_path=NULL;
     }
      

  8.   


    上面是我把注释去掉了的
    this->mPage_item_path->RemoveAll();//你移除了所有的元素 
    this->mPage_item_path->FreeExtra(); 
    这两个应该注释掉的
    如果我把 mPage_item_path 相关的全去掉,就没有内存泄漏报告,郁闷中
      

  9.   


    复制错了,.h 文件和.cpp文件应该是同一个变量 
      

  10.   

    搞不明白,两个文件的代码都帖一下吧,目前看不出什么,只要delete了mPage_list_item应该就没什么问题了,也不需要ReleaseBuffer,除非你GetBuffer了。
      

  11.   

    我RealaseBuffer 是google搜出来的,网上说,把CStringArrry里面的每个都这样,才行,郁闷啊,
      

  12.   


    第二段文字你再看下。从现有代码来看,内存泄漏与CSTRINGARRAY无关。
      

  13.   


    用 在stdafx.h 的第一行加入 include "vld.h"
    然后的输出信息 中的一部份
    ---------- Block 103 at 0x017E2AB8: 108 bytes ----------
      Call Stack:
        f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp (141): CAfxStringMgr::Allocate
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (775): ATL::CSimpleStringT<wchar_t,0>::Fork
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (812): ATL::CSimpleStringT<wchar_t,0>::PrepareWrite2
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (801): ATL::CSimpleStringT<wchar_t,0>::PrepareWrite
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (524): ATL::CSimpleStringT<wchar_t,0>::GetBuffer
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (639): ATL::CSimpleStringT<wchar_t,0>::SetString
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (616): ATL::CSimpleStringT<wchar_t,0>::SetString
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (332): ATL::CSimpleStringT<wchar_t,0>::operator=
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\cstringt.h (1033): ATL::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t> > >::operator=
        f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\array_s.cpp (245): CStringArray::SetAtGrow
        f:\dd\vctools\vc7libs\ship\atlmfc\include\afxcoll.inl (317): CStringArray::Add
        d:\my documents\visual studio 2005\projects\jw_getsoft\jw_getsoft\page1.cpp (28): CPage1::CPage1
        d:\my documents\visual studio 2005\projects\jw_getsoft\jw_getsoft\jw_getsoftdlg.cpp (192): CJW_GetSoftDlg::CJW_GetSoftDlg
        d:\my documents\visual studio 2005\projects\jw_getsoft\jw_getsoft\jw_getsoft.cpp (95): CJW_GetSoftApp::InitInstance
        f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winmain.cpp (37): AfxWinMain
        f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appmodul.cpp (30): wWinMain
        f:\dd\vctools\crt_bld\self_x86\crt\src\crt0.c (263): __tmainCRTStartup
        f:\dd\vctools\crt_bld\self_x86\crt\src\crt0.c (182): wWinMainCRTStartup
        0x7C816FE7 (File and line number not available): RegisterWaitForInputIdle有人用过这工具吗
      

  14.   


    再补充下,上面这个是基类,然后mPage_item_path添加数据是在子类的构造函数中加的
      

  15.   

    CObArray array;
    CAge* pa1;
    CAge* pa2;array.Add( pa1 = new CAge( 21 ) ); // Element 0
    array.Add( pa2 = new CAge( 40 ) ); // Element 1
    ASSERT( array.GetSize() == 2 );
    array.RemoveAll(); // Pointers removed but objects not deleted.
    ASSERT( array.GetSize() == 0 );
    delete pa1;
    delete pa2;  // Cleans up memory.
    CStringarrsy的使用方法和CObArray类似,修改现有的代码,去掉冗余和逻辑不清楚的地方。
      

  16.   


    我把那个CStringArrry 相关的全去掉 再调试。输入信息是这样的了WARNING: Visual Leak Detector detected memory leaks!
    ---------- Block 59 at 0x017EA100: 40 bytes ----------
      Call Stack:
        f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp (141): CAfxStringMgr::Allocate
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (775): ATL::CSimpleStringT<wchar_t,0>::Fork
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (812): ATL::CSimpleStringT<wchar_t,0>::PrepareWrite2
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (801): ATL::CSimpleStringT<wchar_t,0>::PrepareWrite
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (524): ATL::CSimpleStringT<wchar_t,0>::GetBuffer
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (639): ATL::CSimpleStringT<wchar_t,0>::SetString
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (616): ATL::CSimpleStringT<wchar_t,0>::SetString
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\atlsimpstr.h (332): ATL::CSimpleStringT<wchar_t,0>::operator=
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\cstringt.h (1033): ATL::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t> > >::operator=
        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\cstringt.h (810): ATL::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t> > >::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t> > >
        f:\dd\vctools\vc7libs\ship\atlmfc\include\afxcomctl32.h (506): CShellWrapper::CShellWrapper
        f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxstate.cpp (190): AFX_MODULE_STATE::AFX_MODULE_STATE
        f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxstate.cpp (429): _AFX_BASE_MODULE_STATE::_AFX_BASE_MODULE_STATE
        f:\dd\vctools\vc7libs\ship\atlmfc\include\afxtls_.h (227): CProcessLocal<_AFX_BASE_MODULE_STATE>::CreateObject
        f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxtls.cpp (464): CProcessLocalObject::GetData
        f:\dd\vctools\vc7libs\ship\atlmfc\include\afxtls_.h (213): CProcessLocal<_AFX_BASE_MODULE_STATE>::GetData
        f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxstate.cpp (467): AfxGetModuleState
        f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appmodul.cpp (37): AfxInitialize
        f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appmodul.cpp (69): `dynamic initializer for '_afxInitAppState''
        f:\dd\vctools\crt_bld\self_x86\crt\src\crt0dat.c (903): _initterm
        f:\dd\vctools\crt_bld\self_x86\crt\src\crt0dat.c (307): _cinit
        f:\dd\vctools\crt_bld\self_x86\crt\src\crt0.c (249): __tmainCRTStartup
        f:\dd\vctools\crt_bld\self_x86\crt\src\crt0.c (182): wWinMainCRTStartup
        0x7C816FE7 (File and line number not available): RegisterWaitForInputIdle
      Data:
        84 B0 67 00    0B 00 00 00    0B 00 00 00    01 00 00 00     ..g..... ........
        73 00 68 00    65 00 6C 00    6C 00 33 00    32 00 2E 00     s.h.e.l. l.3.2...
        64 00 6C 00    6C 00 00 00                                   d.l.l... ........Visual Leak Detector detected 1 memory leak.
    Visual Leak Detector is now exiting.
    各位谁又能帮我解释下另我想要一个象 c# 的map这类的东西,我找了下vc++的,发现不怎么好用,郁闷中
      

  17.   

    是,我试过你说的方法 我试过很多方法,在google找了一下午了,然后改成上面那样了,
    怎么弄都有内存泄漏
      

  18.   

    你这个是msdn上面的代码,
    我说下,我的顶楼的帖子,那个类是基类,然后他有很多子类,CStringArrry的 add方法是在子类的构造函数中进行的,然后基类去读他的值,然后处理一些,就不做什么了,子类在析构的时候会调用父类的析构吧
      

  19.   

    今年编程不列表,列表只用STL
      

  20.   


    多贴些与CSTRINGARRAY操作相关的代码,我特意试了,没有内存泄露
      

  21.   

    我不用那个了,我换用CMapStringToString 这个类了我的CStringArray 没做,就.h文件里面申明为指针类型,然后在.cpp的构造函数中 初始化 用的new 然后在 OnInitDialog里面会使用这个 CStringArray,然后在析构函数中 释放他CStringArray 添加数据是在这个类的子类的构造函数中使用的,用的Add方法添加数据用CMapStringToString  没报内存泄漏了,郁闷中,有时间在追这个问题,谢谢大家的帮助结贴
      

  22.   

    我也觉得内存不好弄。干脆用vector了。。
      

  23.   

    CStringArray.setat(0,1);//使用之前,先设置可增加的,我之前的内存问题就出在这上面,希望可以帮到大家