关于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;
}
关于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;
}
相关文章推荐
- 关于C++内存问题(转)
- C/C++中关于struct内存对齐问题
- java中使用堆外内存,关于内存回收需要注意的事和没有解决的遗留问题(等大神解答)
- 关于c++中map的内存占用问题
- C++中关于variable 内存分配的问题.
- 关于C++的类对象,内存分布问题
- 整理关于c++内存问题
- C++。memory leak检查办法。一个当内存分配后未回收(或导致各种问题)的检查办法
- 关于C++内存对齐的问题
- 关于C++的类对象,内存分布问题
- 关于C++内存中字节对齐问题的详细介绍
- 关于pragma pack的用法C++中的内存对齐问题
- 关于C++内存越界访问的问题
- 关于C++的new是否会对内存初始化的问题
- 关于C++的new是否会对内存初始化的问题
- 关于C++的new是否会对内存初始化的问题
- 关于pragma pack的用法(四) C++中的内存对齐问题
- 关于C++的new是否会对内存初始化的问题
- 关于c++中map的内存占用问题
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)