如何强制我的 std::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);
  }
}

每个 (fillUpmap) 分配大约 1gig,所以我很想在它耗尽我所有的内存之前把它放回我的系统。

我对 std::vector 也有同样的体验,但我可以通过与空的 std::vector 进行交换来强制它释放。这不适用于地图。

当我使用 valgrind 时,它说所有内存都已释放,因此泄漏不是问题,因为运行后一切都很好地清除了。

编辑:

冲洗必须在清除之后出现。

原文由 monkeyking 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
1 个回答

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

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

地图不像矢量那样有容量与大小的概念。

原文由 Roger Pate 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏