最近用到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;