长 运行 C++ 应用程序中的内存泄漏

Memory Leakage in a long run C++ application

我正在 运行 宁一个长 运行 C++ 应用程序,它分配不同的对象并将其存储在几个双端队列和映射中,并从这些数据结构中释放这些对象 time.I到 day.I 有 运行 内存泄漏检测器 (valgrind) 时,我的内存有少量增加(通常为 1 mb 到 2 mb),但我找不到任何可疑的内存泄漏。 我想知道问题是否出在存储对象的双端队列和映射上。 deque 和 map 的内存是否会在对象从数据结构中弹出时立即将内存释放到 OS? 谁能指出内存增加的解决方案或一般可能的原因?

C++ 标准不保证 delete 会释放内存给 OS。事实上,许多标准 C++ 库并没有这样做。如果您希望将内存释放给 OS,那么您将不得不使用 OS 自己的内存分配例程。

标准 C++ 库提供了自定义分配器,可以帮助您做到这一点。

您可能 运行 进入堆碎片。

如果分配不同大小的内存块,这可能意味着大内存块最终会被分成较小的块而变得不可用。例如:

  • 你分配了一个大块(比如 1 MB)并且 运行time 从 OS
  • free大块
  • 您分配了一个较小的块,然后 malloc 将其从释放的 1 MB 块中删除
  • 您尝试再次分配一个 1 MB 的块,但是 free 的块不再足够大,因此 运行time 从 [=29] 请求一个新的 1 MB 块=]

如果这种情况持续几天,您最终可能会得到很多 0.99 MB 的免费块,但是 运行time 每次仍然需要从 OS 中获取一个新的 1 MB 块需要它。