长 运行 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 块需要它。
我正在 运行 宁一个长 运行 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 块需要它。