如何强制我的std :: map释放使用的内存?

mon*_*ing 11 c++ memory stl vector map

我正在使用std :: map,我似乎无法将内存释放回操作系统.看起来像,

int main(){
  aMap m;

  while(keepGoing){
    while(fillUpMap){
       //populate m
    }
    doWhatIwantWithMap(m);
    m.clear();//doesnt free memory back to OS

    //flush some buffered values into map for next iteration
    flushIntoMap(m);
  }
}
Run Code Online (Sandbox Code Playgroud)

每个(fillUpmap)分配大约1gig,所以我非常有兴趣在它耗尽我的所有记忆之前将它恢复到我的系统.

我经历过与std :: vector相同的事情,但是我可以通过与空std :: vector交换来强制它释放.这不适用于地图.

当我使用valgrind时它表示所有内存都被释放,所以它不是泄漏的问题,因为一切都在运行后很好地清除了.

编辑:

清除后必须出现冲洗.

小智 13

m.clear() 将内存释放回堆,但堆实现通常不会将其释放回操作系统(即使它们可以,碎片等问题也很难).

这是默认分配器的工作方式,如果您为地图指定了自己的分配器,它可能有自己的缓存.但是,即使在这种情况下,它也应该被缓存以便立即重用.

地图没有像矢量那样的容量与大小的概念.


Fer*_*cio 2

如果您在堆上创建映射(通过 new),删除它将释放它使用的所有内存。