linux c++ stl的内存如何才会释放

voidfun(){map<int,int>mapInumber;for(inti=0;i<6000000;i++){mapInumber[i]=10;}return;}... void fun()
{
map<int,int> mapInumber;
for ( int i=0; i<6000000; i++ )
{
mapInumber[i]=10;
}
return;
}
int main()
{
fun();

cout << "------------------" << endl;

getchar();
/*
char *p = new char[1*1024];
delete[] p;
*/
sleep(100);
return 0;
}
如果把注释掉的部分打开,就能释放内存
不知道为什么
展开
 我来答
ExcaliburZ
2012-03-05 · TA获得超过1102个赞
知道小有建树答主
回答量:750
采纳率:0%
帮助的人:822万
展开全部
首先回linxxx3童鞋的:
根据map的代码片段,可以看见重载下标运算符如下:
template<class Key,class T,class Compare=less<Key>,class Alloc = alloc>
{
....省略
T& operator[](const Key_type& k){
return (*((insert(value_type(k,T() ) ) ) .first)).second;
}
....省略
}
由以上代码可知.下标运算符中间接调用insert.
即使事先不存在的pair也会被新插入再取出value来.
童鞋,该补课了.

再回答楼主问题:
stl的内存实质上都是由allocator来负责管理的.
alloctor会管理一个内存池.按照标准而言.这个内存池会在stl实例被析构的时候将内存池销毁并还给系统调用库.
注意:是还给系统调用库.没有说还给系统了.
此时,这段被归还的内存是可以用于存放其它东西的.
只是他们还没有被还给系统.
如何"强迫他"还给系统呢?
这个问题要问这个系统库,一般而言.当有新的内存请求,而系统觉得内存太少的时候.他就问去检查下看有谁把内存还回来了.如果有,就把它们取回空闲内存区.
这就是为什么你随便new个什么内存立即 就回到系统的原因.
这个问题要深究可以去查阅linux内核编程相关的东西.
更多追问追答
追问
你应该没有具体测试过,只是看到这个例子,凭感觉回答.
如果按照你的意思
fun();
函数外面随便
map mapInumber;

之后再随便操作一下mapInumber[1]=10;
应该释放内存。而实际上没有.
追答
你这是找茬啊亲。不信我的话你可以去参考两本书。
一本是侯捷的stl深入剖析。里面非常前面详细讲解了stl的内存运作机制。
一本是罗德里格斯的Linux内核编程的第四章关于内存的管理机制问题。
我已经说了:
1:stl是有内存池机制的。并不是内存释放就直接还给系统了。不信你直接在fun后面再for 6000000次。内存也不会增加。
2:即便是这样。也不一定会马上进入系统的内存资源。这一块是由linux的内存管理器来控制的。
linux为了效率。所有还给他的内存他不会去马上回收,还保留给程序堆。一方面系统中有一个叫做kswapd的进程。他不断的定时去检查需要收拾的内存。回到了分配页面。另一方面。在你需要申请的内存不够用的时候或者当kswapd感受到系统中内存少得危险的时候。他会检查谁把内存还回来了。再收拾起来分配。这是你无法控制的。要问系统库去。但是linux是绝对能保证这一块安全的。

至于你说你的程序为了new一下就让内存回去了。我只能说。那是你碰运气的(kswapd刚好定时回收内存了)或者你的new让系统觉得内存少得危险了。和你的行为没有任何关系。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
linxxx3
2012-03-05 · 超过69用户采纳过TA的回答
知道小有建树答主
回答量:160
采纳率:0%
帮助的人:187万
展开全部
fun那个函数里map的用法错了,向map里添加项必须用insert之类的方法,不插入直接用下标访问是错的,后面就不用谈了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式