【发布时间】: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