FastMM是否检测到所有内存泄漏

时间:2010-12-18 12:01:19

标签: delphi fastmm

最近有人建议(My program never releases the memory back. Why?)我的程序泄漏了一些内存。我将FastMM设置为激进,并在关闭程序时报告没有内存泄漏。

无论如何,我想知道FastMM是否可以检测到内存泄漏?

更新:我个人不使用Win API来分配内存。但我担心我使用的一些第三方组件(不是很多)可能会使用它。你能告诉我FastMM无法拦截的所有API调用吗?我将在我的代码中搜索它们。感谢。


Delphi 7,Win 7 32位
FastMM 4.97
我对接口不感兴趣。

6 个答案:

答案 0 :(得分:4)

FastMM是Windows内存管理之上的一层。显然,如果您(或某些组件或其他任何组件)使用Windows API分配内存,则此类分配会绕过FastMM,您将无法跟踪它。 BTW Delphi内存管理器本身使用该API来分配内存块。因此,如果您需要在该级别上查看分配,FastMM是不够的 - 您必须使用像AQTime和类似的工具(正如我在上一个问题中所建议的那样)。

答案 1 :(得分:3)

我从未知道FastMM无法检测到内存泄漏。

答案 2 :(得分:3)

不,只有内存泄漏哪个内存由FastMM进行分配。

修改 也许答案看起来很好,但事实并非如此!如果有人检查 FastMM haw是否可以看到内存分配的每个指针都被推送(并在FreeMem中加入)到一个堆栈中(有更多的堆栈,取决于内存大小)所以在关闭应用程序结束时,FastMM仅检查堆栈,如果是堆栈中的内容,如果是,则报告内存泄漏!

答案 3 :(得分:3)

有几种可能的原因:(适用于任何内存管理器)

  • 你的主程序循环泄漏了内存,但是在关闭时释放的东西会这样做
    • 最简单的情况是登录备忘录。备忘录变得越来越大,但在关机时会被破坏。
  • 内存分配在fastmm的控制之外
    • 直接从Windows分配
    • 在dlls中分配的内存等。
  • Heapfragmentation。内存管理器保持分配大块(例如,因为它仍然包含很少的分配百分比)。结果:应用程序不使用它,但它也不会释放到操作系统。运行时/内存管理器会保留它。
    • fastmm应该更能抵御这种现象,但是有疑问会尝试打印heapmanager信息,看看是否是这种情况。

答案 4 :(得分:2)

FastMM不会检测不通过FastMM的内存分配泄漏。

这可以包括来自您使用的第三方库或DLL的GlobalAlloc调用 修改:Microsoft的MSDN有一个nice list of memory allocation methods

这实际上是我在my answer中提到的我之前提到的FastMM问题的问题。

您可以使用VMMap之类的工具来跟踪FastMM无法检测到的内存泄漏。

- 的Jeroen

答案 5 :(得分:2)

已经有很多好的答案,但有一点尚未提及......

大多数内存泄漏检测器都会检测到大量的“泄漏”,因为内存已被释放,但是在它不再使用之后会被释放。例如,对象堆叠在TObjectList中。对象放在对象列表中,但在使用它们之后,您不会释放它们。当对象列表也被销毁时,它们将被销毁(当应用程序关闭为例时,假设OwnsObject = True)。由于对象实际上已被释放,因此对象不会“泄露”,但仍会使应用程序随着时间的推移使用越来越多的内存。

FastMM不会报告这些,因为它只进行“全面运行”分析。要检测这些,您需要一个允许部分运行的内存泄漏检测器,即分析执行期间A点和B点之间“泄漏”的内容。 Eugene提到的AQTime允许进行那种检查。但请注意,需要进行一些分析,因为这将产生许多误报(几乎所有“realloc”操作都会被标记为泄漏)。