我正在使用 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 许可协议
m.clear()
将内存释放回堆,但堆实现通常不会将其释放回操作系统(即使可以,碎片等问题也会使其变得困难)。这就是默认分配器的工作方式,如果您为地图指定了自己的分配器,它可能有自己的缓存。但是,即使在这种情况下,它也应该被缓存以便立即重用。
地图不像矢量那样有容量与大小的概念。