【问题标题】:Win32/C++ Memory LeakWin32/C++ 内存泄漏
【发布时间】:2015-03-20 10:03:11
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能把你的代码贴在你认为可能有内存泄漏的地方吗?你也可以使用 valgrind 来分析你的代码。
  • 您肯定存在内存泄漏。在没有看到任何代码的情况下,除了说您应该释放您分配的任何内存之外,我们无法为您提供帮助......
  • @frymode:从问题标题来看,你会这么认为,但如果你真的阅读了整个问题,就会有很大的不同。
  • “物理内存的使用导致我的应用程序出现性能问题。”很可疑。你能用一些数字来证实这一点吗? (我的系统有 x GB 的物理 RAM,我正在使用 Y 工具查看“提交的页面”,当这个数字超过 Z 时,我的应用程序开始花费 r 毫秒来执行操作 q 而不是 t 毫秒)

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    可能磁盘缓存正在增长,可能是低优先级的后台线程将空闲页面归零,并且您的工具将“空闲但脏”与“空闲并归零以供重用”不同。

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

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-01-27
      • 2010-11-11
      • 2017-02-18
      • 1970-01-01
      • 2015-11-19
      • 2014-11-01
      • 2020-03-31
      • 2016-03-15
      • 2015-07-25
      相关资源
      最近更新 更多