.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;
}
各位请讲解下
检测下是什么地方泄漏了内存
不一定是这个地方有泄漏
自己还可以用工具检查一下泄漏在什么地方
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;
}
上面是我把注释去掉了的
this->mPage_item_path->RemoveAll();//你移除了所有的元素
this->mPage_item_path->FreeExtra();
这两个应该注释掉的
如果我把 mPage_item_path 相关的全去掉,就没有内存泄漏报告,郁闷中
复制错了,.h 文件和.cpp文件应该是同一个变量
第二段文字你再看下。从现有代码来看,内存泄漏与CSTRINGARRAY无关。
用 在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有人用过这工具吗
再补充下,上面这个是基类,然后mPage_item_path添加数据是在子类的构造函数中加的
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类似,修改现有的代码,去掉冗余和逻辑不清楚的地方。
我把那个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++的,发现不怎么好用,郁闷中
怎么弄都有内存泄漏
我说下,我的顶楼的帖子,那个类是基类,然后他有很多子类,CStringArrry的 add方法是在子类的构造函数中进行的,然后基类去读他的值,然后处理一些,就不做什么了,子类在析构的时候会调用父类的析构吧
多贴些与CSTRINGARRAY操作相关的代码,我特意试了,没有内存泄露