我正在开发一个模式搜索程序,它不断地从堆中分配和释放。该程序旨在非常关注内存使用情况,所以当我完成内存时,它需要被释放到操作系统。据说我已经做了大量的内存泄漏检测,发现CRT转储日志中出现的所有泄漏,在Visual Studio和WinDbg的Visual Leak检测器的帮助下进行堆栈跟踪。
主要的问题是,在处理文件时发生的堆活动越多,我留下的这块内存就越多,没有释放到操作系统,但是在程序终止后它也没有显示为泄漏。我使用以下代码行来获取程序的资源使用情况:
PROCESS_MEMORY_COUNTERS pmc;
GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
PListType physMemUsedByMe = pmc.WorkingSetSize;
return physMemUsedByMe/1000000.0f;
这将返回程序正在使用的MB内存量,并在程序退出之前立即进行此调用。我可以有零内存泄漏,但这个剩余数据高达500 MB。不确定这些东西是否以某种方式坐在堆栈上或是这个堆碎片?我确实使用STL地图和矢量,但如果我使用指针,我会正确清理它们。
我一直在做侦探工作已经有一段时间了,我真的没有用这样的论坛提出答案,所以我想特别提出我的问题。任何帮助都有很长的路要走。如果我只是猜测并不重要,我只需要在我自己的头脑之外进行一些头脑风暴。谢谢!
答案 0 :(得分:4)
仅仅因为你释放内存并不意味着它会立即返回给操作系统。您的标准库可能具有从操作系统获得的一堆内存,但在您的程序中当前没有使用。这不是泄露的记忆,在实践中通常不是问题。