终于知道微软的东西为什么耗内存了....CString就是一个祸源!
格利高里 2003-02-12 06:13:32 最近看了一下CString的源代码,看到内存分配的地方FixedAlloc.h/FixedAlloc.cpp
CString为了提高效率,预先分配了一组长度固定的64*(64/128/256/512)的内存块,有意思的是
CFixedAlloc的Alloc()方法申请/分配内存,在FreeAll()函数中释放内存,Free(void* p)释放使用节点,并不回收内存,析构函数中调用FreeAll()释放内存。
CString的内存分配中,定义了CFixedAlloc类型的4个静态变量,并只调用CFixedAlloc的Alloc()、Free(void* p)方法,所以只有内存分配,并没有释放(除非程序退出时)。可见如果一次申请大量CString字符串的话,就算立刻再删除这些CString,内存也不会回收。这样效率虽然高,内存占的可就比较多啦。
一个测试例子
void CTestDlg::OnButtonTest()
{
// TODO: Add your control notification handler code here
CPtrList list(1000);
CString* strMsg;
AfxMessageBox("现在看看内存占用多大?");
for(int i=0;i<50000;i++)
{
strMsg = new CString("1234567890", 20);
list.AddTail(strMsg);
}
AfxMessageBox("生成50000字符串,再看看内存占用多大?");
POSITION pos;
for( pos = list.GetHeadPosition(); pos != NULL; )
{
strMsg = (CString*)list.GetNext( pos );
delete strMsg;
}
list.RemoveAll();
AfxMessageBox("函数结束,字符串也删除了,再看看内存减小了吗?");
}