终于知道微软的东西为什么耗内存了....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("函数结束,字符串也删除了,再看看内存减小了吗?");
}
...全文
574 点赞 收藏 105
写回复
105 条回复
dumack 2003年02月26日
MS一定为他的糟糕的CString而后悔,因此在WTL中,他实现了一个名称和接口几乎完全一致的CString;但是,但是,最重要的是------没有用到CFixedAlloc!!!
回复 点赞
cutecute 2003年02月25日
回复 点赞
Kevin_qing 2003年02月24日
内存池
回复 点赞
fishsward 2003年02月23日
good
回复 点赞
fffei 2003年02月22日
SORRY
是我弄错了
回复 点赞
fffei 2003年02月22日

When a CPtrList object is deleted, or when its elements are removed, only the pointers are removed, not the entities they reference。
我想楼主可能疏忽了吧
可以把CString的源代码贴出来吗??
回复 点赞
whjpn 2003年02月21日
mark
回复 点赞
LittleLee 2003年02月20日
学习!
回复 点赞
freelove1 2003年02月17日
學習ing
回复 点赞
LikePig 2003年02月17日
mark
回复 点赞
shan_ghost 2003年02月17日
晕啊,楼主没听说过内存池么?
回复 点赞
Rigel 2003年02月16日
学习学习
回复 点赞
chanet 2003年02月16日
gz
回复 点赞
曲滨_銘龘鶽 2003年02月16日
VC6挂了所以用VC.NET 测试
没这问题(只要不连续的点按钮)
(一次运算后停7,8 秒 好像还会多)
回复 点赞
nblueguy 2003年02月16日
这是mfc开发人员设计的一个策略.因为CString要经常使用.如果不断DELETE.会生成许多内存碎片.
回复 点赞
代码之诗 2003年02月15日
对不定长对象的 string ,我没有想过,但我想,比较理想的方式应该按以下原则:
1、出于运行效率考虑,应转换为定长问题;
2、出于开发效率考虑,应尽量用标准库;

要符合以下原则,有一个模式可以用:使用代理类。将不定长对象用代理封装(即所谓的句柄技术),代理类对下管理这些对象的生成、调用与析构,对上提供这些对象的访问接口。这样,就可以用 basic_string<代理类>了。
只是一个基本的想法,从未实践过此类问题。看来 liguangyi 兄正在做,如有心得,敬请指正。
回复 点赞
skyie 2003年02月15日
cstring 现在有这个不是问题的问题,大家可以不去探讨研究,随着程序员水平的提高,可能会发现一些新的问题,大家还是看长远点,全面点...
回复 点赞
jian 2003年02月15日
好像早就广为人知了,不过楼主精神可嘉
回复 点赞
XueBoy163 2003年02月15日
CString的内存如果不在Delete时释放在什么时候释放?
程序结束?
那真是太好了!再也没有什么Memory Leak了!
回复 点赞
WarnRay 2003年02月14日
靠!明天去加内存!
P4 3.06的机器配128M的内存太寒酸了
写了一个测试程序就要挂机!靠!
个人认为CString和内存好象没有什么必然的联系吧!
回复 点赞
发动态
发帖子
VC/MFC
创建于2007-09-28

7889

社区成员

42.1w+

社区内容

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