Win32/C++ 内存泄漏

Win32/C++ Memory Leak

本文关键字:泄漏 内存 C++ Win32      更新时间:2023-10-16

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

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

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

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

谁能推测为什么物理内存没有返回到系统?

物理内存始终在操作系统的控制之下。 无论您使用什么工具来测量物理内存使用情况,都会误导您。

可能是

磁盘缓存正在增长,可能是将可用页面清零的低优先级后台线程跟不上,并且您的工具将"免费但脏"与"免费和归零以供重用"不同。

应用程序也可能在某些驱动程序或其他尚未退出的进程中触发内存泄漏。

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

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

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

它使用内存的方法之一是从磁盘缓存文件。目录也是一个文件,因此当您通读它时,它也会被缓存。

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