
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;
}
如果把注释掉的部分打开,就能释放内存
不知道为什么 展开
{
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;
}
如果把注释掉的部分打开,就能释放内存
不知道为什么 展开
展开全部
首先回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内核编程相关的东西.
根据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让系统觉得内存少得危险了。和你的行为没有任何关系。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询