Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi FastMM是否检测到所有内存泄漏_Delphi_Fastmm - Fatal编程技术网

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

Delphi FastMM是否检测到所有内存泄漏,delphi,fastmm,Delphi,Fastmm,最近有人建议()我的程序泄漏一些内存。我已将FastMM设置为aggressive,当我关闭程序时,它不会报告内存泄漏 无论如何,我想知道是否有内存泄漏是没有检测到的FastMM 更新:我个人不使用WinAPI来分配内存。但我担心我使用的一些第三方组件(不是很多)可能会使用它。你能让我知道所有FastMM无法拦截的API调用吗?我将在我的代码中搜索它们。谢谢 Delphi 7,Win 7 32位 FastMM 4.97 我对接口不感兴趣。我从来不知道FastMM无法检测内存泄漏。FastMM是

最近有人建议()我的程序泄漏一些内存。我已将FastMM设置为aggressive,当我关闭程序时,它不会报告内存泄漏

无论如何,我想知道是否有内存泄漏是没有检测到的FastMM

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


Delphi 7,Win 7 32位
FastMM 4.97

我对接口不感兴趣。

我从来不知道FastMM无法检测内存泄漏。

FastMM是Windows内存管理之上的一层。显然,如果您(或某些组件或其他什么)使用Windows API分配内存,那么这种分配将绕过FastMM,您将无法跟踪它。顺便说一句,Delphi内存管理器自己使用该API分配内存块。因此,如果您需要查看该级别的分配,FastMM是不够的-您必须使用AQTime和类似的工具(如我在前面的问题中所建议的)

否,只有FastMM分配的内存泄漏

编辑:
也许答案看起来很复杂,但事实并非如此!如果有人检查了FastMMhaw,就可以看到内存位置的每个指针都被推入(并在FreeMem弹出)其中一个堆栈(有更多堆栈,取决于内存大小),因此在关闭应用程序的最后,FastMM只检查堆栈,如果堆栈中有什么,如果是,就报告内存泄漏

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

  • 主程序循环会泄漏内存,但会泄漏到关机时释放的内存
    • 最简单的情况是登录到备忘录。备忘录越来越大,但在关闭时被销毁
  • 内存分配在fastmm的控制之外
    • 直接从windows分配
    • 在DLL等中分配的内存
  • 堆积碎片。内存管理器保持分配的大数据块(例如,因为它仍然包含一小部分分配)。结果:应用程序没有使用它,但也没有发布到操作系统。运行时/内存管理器将其保留。
    • fastmm应对这种现象更具弹性,但毫无疑问,请尝试打印heapmanager信息,以查看是否存在这种情况

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

这可能包括来自您使用的第三方库或DLL的GlobalAlloc调用。
编辑:微软的MSDN有一个

事实上,这就是我在前面的FastMM问题中提到的问题

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


--杰罗恩

已经有很多好的答案,但有一点还没有提到

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


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

@satter我刚刚编写了一个应用程序,它分配一块内存,零填充它,然后释放它。Process Explorer报告的工作集统计信息会上升,然后返回到它们开始的级别。我用的是香草D2010和FastMM(当然这是默认的)。@我的问题是。为什么您要查找FastMM的问题,而不是首先查看自己的代码?FastMM的应用非常广泛,我通常倾向于从相信它做得很好开始。@最后,您是否尝试过我在其他问题中发布的基于MSVCRT的MM?我打赌它的性能与FastMM相同,这可能会说服您停止在那里寻找问题,而是查看您自己的代码。@David我不认为祭坛声称FastMM是问题的根源。此外,在他的代码中一定有什么东西引起了这个问题,祭坛正在寻找一种方法来发现它是什么。@尤金先前的问题叫FastMM,它有助于在前TraceSeEuGein的上下文中考虑这个线程。谢谢你的确认。不。我不使用WindowAPI来分配内存。你不使用,但可能有一些组件使用。你是对的。我打算在我使用的第三方代码中搜索这种API调用。我想听听投票失败的原因。也许这里有人有过FastMM未能检测到内存泄漏的经验,与我们大家分享这一经验将是非常棒的。我没有投反对票,但我确实对另一个FastMM神话有过不好的经历。对于我的主要代码库,它比最初的MM慢得多。@Marco我对下行投票没有问题,只是没有解释就没有人可以学习。我喜欢这样做的原因是我可以学习。至于FastMM性能,我只发现它在线程争用严重的情况下存在问题,这就是我使用MSVCRT中的malloc的原因。旧Borland MM因地址>2GB wh而灾难性失败