Win32 / C ++内存泄漏

时间:2015-01-21 19:00:56

标签: c++ windows memory-leaks win32-process

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

可能是磁盘缓存正在增长,可能是零优先级后台线程,零空闲页面没有跟上,你的工具对待“免费但脏”不同于“免费和归零用于重用”。

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

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

答案 1 :(得分:1)

不要花太多精力搞清楚物理内存是怎么回事,操作系统应该好好处理它。除非您对操作系统内核中发生的事情有充分的了解,否则您通常只是试图解决问题。我怀疑它会在磁盘缓存中留下一些东西,它会在需要免费页面时释放它。

答案 2 :(得分:1)

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

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

我个人总觉得Windows会进行太多的磁盘缓存。我更有可能切换到我暂时没有使用的程序,而不是访问我暂时没用过的文件。