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

本文探讨了C++中STL的vector和map在内存回收上的不同行为。在Linux(CentOS 5.5)下,map在作用域结束时内存未被系统回收,但可被进程内部重用,而Windows系统则能回收。vector使用swap方法可释放内存,而map的内存释放情况存在疑问,特别是其无capacity属性导致的内存管理不同于vector。
最低0.47元/天 解锁文章
655

被折叠的 条评论
为什么被折叠?



