Win32/C++ 内存泄漏

Win32/C++ Memory Leak

我遇到了一个奇怪的内存问题。随着时间的推移,我的 C++ 应用程序执行的过程同时消耗虚拟内存和物理内存。

当我关闭进程时,它消耗的任何虚拟内存都返回给系统。但是,消耗的大部分物理内存永远不会返回给系统。我可以在任务管理器中查看它。

我的应用程序动态分配的任何内存都应在其进程终止时返回给系统。

我的应用程序唯一可疑的计算是重复调用 FindFirstFile/FindNextFile 来检查文件系统中的一些现有文件。该操作总共检查了大约 1000 万个文件。在这种情况下,我相信我正确地关闭了 FindFirstFile 返回的文件句柄。

有人可以推测为什么物理内存没有返回给系统吗?

不要花太多精力弄清楚物理内存发生了什么,操作系统应该会处理它。除非您对 OS 内核中正在发生的事情有很好的理解,否则您通常只会绕圈子试图弄清楚。我怀疑它在磁盘缓存中留下了一些东西,它会在需要空闲页面时释放它。

物理内存总是在OS的控制之下。无论您使用什么工具来测量物理内存使用情况都会误导您。

可能磁盘缓存正在增长,可能清零可用页面的低优先级后台线程跟不上,您的工具对待 "free but dirty" 与 "free and zeroed for reuse" 的方式不同。

也有可能您的应用程序在某些驱动程序或另一个尚未退出的进程中触发了内存泄漏。

在任何情况下,您的应用程序在终止后都不会继续拥有物理内存。

OS 的目标是尽可能多地使用物理内存 - 任何未使用的东西都被浪费了。分页系统将确保任何需要物理内存的应用程序都能获得它,必要时通过换出其他内存。

它使用内存的方式之一是从磁盘缓存文件。一个目录也是一个文件,所以当你阅读它时它也会被缓存。

我个人一直觉得 Windows 做了太多的磁盘缓存。与访问一段时间未使用的文件相比,我更有可能切换到一段时间未使用的程序。