终于知道微软的东西为什么耗内存了....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("函数结束,字符串也删除了,再看看内存减小了吗?");
}
...全文
701 105 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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和内存好象没有什么必然的联系吧!
加载更多回复(85)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧