【问题标题】:Heap intensive c++ program堆密集型 C++ 程序
【发布时间】:2016-08-20 07:56:09
【问题描述】:

我正在开发一个模式搜索程序,该程序不断地从堆中分配和释放。该程序旨在非常注意内存使用情况,因此当我使用完内存时,需要将其释放给操作系统。话虽如此,我已经进行了广泛的内存泄漏检测,并在 Visual Studio 的 Visual Leak 检测器和用于堆栈跟踪的 WinDbg 的帮助下发现了 CRT 转储日志中出现的所有泄漏。

主要问题是在处理文件时发生的堆活动越多,我剩下的这块内存就越多,没有释放给操作系统,但在程序终止后它也没有显示为泄漏.我使用这些代码行来获取程序的资源使用情况:

PROCESS_MEMORY_COUNTERS pmc;
GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
PListType physMemUsedByMe = pmc.WorkingSetSize;
return physMemUsedByMe/1000000.0f;

这将返回程序正在使用的内存量(以 MB 为单位),我在程序退出之前进行了此调用。我可以有零内存泄漏,但最多可以有 500 MB 的剩余数据。不确定这些东西是在堆栈上还是堆碎片?我确实使用 STL 映射和向量,但如果我使用指针,我会正确清理它们。

我从事侦探工作已经有一段时间了,我真的无法通过这样的论坛找到答案,所以我想专门问我的问题。任何帮助都会大有帮助。如果我只是一个猜测也没关系,我只需要在我自己的头脑之外进行一些头脑风暴,哈哈。谢谢!

【问题讨论】:

  • 您有任何全局或局部静态变量吗?在main 函数返回之后(即在您的检查之后),它们才会被破坏。此外,也许您获得的金额还包括可执行程序和所有映射的 DLL?除了约翰·兹温克的回答之外。
  • 这是内存分配的工作方式。当您释放内存时,它可以在同一进程中重新分配,但在进程退出之前不会释放回操作系统。但这在现代虚拟内存操作系统中也基本上不是问题,因为如果物理内存有任何压力,与您的进程相关的大部分未使用内存最终将被换出。但是当程序退出时,该内存绝对释放。
  • @JohnBollinger 这看起来像是答案而不是评论。
  • 谢谢@NathanOliver,显然John Zwinck 也这么认为。我认为没有必要重复他的回答。
  • 我确实有全局变量和静态变量,它们已正确释放,不会随着时间的推移而构建。我想了一会儿,可能写入日志文件会导致问题,但后来我删除了日志记录并发生了同样的构建......

标签: c++ memory memory-leaks heap-memory fragmentation


【解决方案1】:

仅仅因为您释放了内存并不意味着它会立即返回给操作系统。您的标准库可能有一堆从操作系统获得但当前未在您的程序中使用的内存。这不是内存泄漏,在实践中通常不会出现问题。

【讨论】:

  • 比如说我想运行一个程序,它一次只能分配 4 GB 的内存,并且这个内存会随着时间的推移而增加和增加。最终我将没有足够的内存来运行我的程序。我的程序的性质是它可以一次运行几天,我担心没有释放到操作系统的内存可能会导致最终的分页......
  • @user3734523 你释放的内存可能仍然映射到你的进程,这并不意味着它不能用于其他进程。如果操作系统认为有必要,它将从您的进程中取消映射页面并将其提供给其他进程。
  • @user3734523:这种事情最好不要提前过多担心。编写你的代码,运行它,看看你有什么实际问题。然后解决这些问题。
  • @user3734523,此外,一旦您释放内存,它就可以为将来的分配请求提供服务。您不应该看到整个进程的使用量远远超过它一次需要的最大值。
  • 我不明白的是,当我解除分配向量时,我可以看到内存使用量下降,但为什么一些内存仍然连接(映射)到程序。为什么有些东西会发布到操作系统,为什么同样会保留。这是 stl 容器做的某种内存缓存吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多