【问题标题】:Memory Leakage in a long run C++ application长期运行的 C++ 应用程序中的内存泄漏
【发布时间】:2025-12-29 08:35:12
【问题描述】:

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

【问题讨论】:

  • 你确定不是对象的数量一直在增加吗?也就是说,您是否检查了所有容器的大小?
  • 当您从容器中移除项目时,容器不会释放内存。因此,容器以最大容量保留所需的任何内存。如果你想释放内存,你必须明确地将数据移动到一个新的容器中。
  • 是的,我检查了容器的大小。大小一直在一个恒定范围内,即,当一个对象从中弹出时,另一个对象被推送到数据结构中。对象已在范围内(25,000 到 25,050)。
  • @Galik 该评论是错误的。 vector 是这样,但其他容器不是。

标签: c++ memory dictionary memory-leaks deque


【解决方案1】:

C++ 标准不保证删除会向操作系统释放内存。事实上,许多标准 C++ 库不这样做。如果您希望将内存释放给操作系统,则必须使用操作系统自己的内存分配例程。

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

【讨论】:

  • 感谢您的评论,但我使用 malloc 分配内存并释放内存。当从中弹出对象时,deque 和 map 会释放其内存吗?您能提出任何可能的建议吗?导致内存增加的原因?
  • mallocfree 在 C++ 程序中? newstd::unique_ptr 呢?
  • 是什么让你认为 free 会将内存返回给操作系统?我已经提出了一个理由,不知道我还有什么要补充的。
  • 我已经重写了 new 操作符来调用 malloc。
  • 再次,是什么让您认为 free 会将内存返回给操作系统。一般不会。
【解决方案2】:

您可能会遇到堆碎片。

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

  • 您分配一个大块(例如 1 MB),运行时从操作系统获取该块
  • free大块
  • 您分配了一个较小的块,malloc 将其从已释放的 1 MB 块中剔除
  • 您尝试再次分配一个 1 MB 的块,但 free'd 的块已不够大,因此运行时从操作系统请求一个新的 1 MB 块

如果这种情况持续数天,您最终可能会得到大量可用的 0.99 MB 块,但运行时仍必须在每次需要时从操作系统获取一个新的 1 MB 块。

【讨论】: