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

标签 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);
  }
}

每个 (fillUpmap) 分配大约 1gig,所以我非常想在它耗尽我所有的内存之前将它返回到我的系统中。

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

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

编辑:

flush 必须出现在 clear 之后。

最佳答案

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

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

map 不像 vector 那样有容量与大小的概念。

关于c++ - 如何强制我的 std::map 释放使用的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2629018/

相关文章:

c++ - 我如何处理队列前端和弹出功能

c++ - 为什么我尝试将按钮连接到 lambda 会失败?

c++ - QFileSystemWatcher:检测文件是否已刷新

python - 检查 PyObject 是否为 None

android - 应用程序崩溃是因为占用太多内存?

c - 是否可以保留指向局部变量超出该变量范围的指针?

c++ - 在 C++ 程序中使用电子围栏

c++ - 使用波浪号获取 int 的 MAX 值

c++ - 无论模板参数如何,哪些 std::map 方法是相同的(并且可能共享符号)?

c++ - 问题在C++中打印对的优先级队列的所有值