格利高里 北京中彩和雅文化传播有限公司 技术总监  2003年02月12日
终于知道微软的东西为什么耗内存了....CString就是一个祸源!
最近看了一下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("函数结束,字符串也删除了,再看看内存减小了吗?");
}
...全文
569 点赞 收藏 105
写回复
105 条回复

还没有回复,快来抢沙发~

发动态
发帖子
VC/MFC
创建于2007-09-28

7870

社区成员

42.1w+

社区内容

VC/MFC相关问题讨论
社区公告
暂无公告