您的位置:首页 > 编程语言 > C语言/C++

关于c++ stl 内存回收问题

2011-11-30 10:41 381 查看
最近用到c++ stl 的map和vector来处理大量数据,发现内存实在是个问题,网上对这个问题也讨论的很多,现就我自己的实验和网上的讨论做下总结。

关于vector:

这个好像没什么问题,用swap系统可以回收内存,作用域结束(比如声明一个vector为局部变量的函数退出后)也会自动系统也会自动回收。

关于map:

在linux (CentOS release 5.5,内核2.6.34.7,gcc version 4.1.2 20080704 (Red Hat 4.1.2-48))下,用尽网上所说的一切办法,即便map的作用域结束,系统也并没有回收内存,但是这部分内存还是能够被利用来分配给新的map,按照网上的说法是这部分内存缓存起来供此进程来用。也就是说一个进程的map的内存被释放掉后只能被此进程利用,系统的其他进程用不了。

在windows下却能够被系统回收。

另外关于swap的一点疑问有待考证:

map并没有capacity一说,它用红黑树非连续分配内存,clear和swap都应该会释放内存给进程(windows给系统)?

但是vector是有capacity的,所以clear只是把元素给清空,但是分配给它的内存并没有清空,只能用swap的办法释放内存?

举例某次试验代码:

/** test for stl mem**

******by lcj*******/

#include <vector>

#include <map>

#include <iostream>

using namespace std;

void fun(int i)

{

map<long int,long int> imap;

for(long int i=0;i<1024*1024*20;i++)

{

imap.insert(make_pair(i,i));

}

cout<<"please put in a int : ";

cin>>temp;

// vector<int> ivec; 如果在此处用vector存几个数,linux下内存又被系统神奇般的回收了

}

int main()

{

int temp;

fun(i); //在调用fun后map应该被释放掉了,但是用用在linux下用top观察,内存被没有被系统回收,仍然被此进程占有。

//而在windows下用资源管理器观察内存却被系统回收

cout<<"please put in a int : ";

cin>>temp;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: