修复内存泄漏

时间:2011-12-04 11:40:56

标签: delphi memory-leaks

我最近发现Delphi有一个名为ReportMemoryLeaksOnShutdown的全局变量,当设置为True时,将检测应用程序关闭时的内存泄漏。我在阅读其他相关问题的一些评论时发现了这些信息:What is the best tool to detect memory leaks in Delphi

所以从项目来源我把ReportMemoryLeaksOnShutdown := True;

现在,当我的应用程序关闭时,它会消耗大量的内存泄漏。我的直接想法是检查创建的对象是否正确释放(try..finally..free等)。

我已经查看了代码,我无法看到泄漏可能来自哪里,现在我需要找到它们,因为如果在退出应用程序时报告内存泄漏那么这意味着内存泄漏运行时,它的大小会变大而且很糟糕!

从上面的链接推荐第三方工具,如Eureka Log。有没有办法只使用IDE和调试器来帮助我找到并修复问题区域?

更新

我设法摆脱了大约6次内存泄漏,我发现它与MDI Childs有关。孩子们在列表框中持有一些指针数据,当主应用程序关闭时,它没有正确释放孩子,现在已经修复了。

我现在留下了这两个错误:

enter image description here

我发现这篇帖子http://fgaillard.com/2011/02/when-the-debugger-leaks/可能暗示调试器出现上述错误?

2 个答案:

答案 0 :(得分:19)

首先,确保获得the full version of FastMM。它有一些额外的功能,例如FullDebugMode,它将在这里为您提供帮助。使用编译器选项中定义的FullDebugMode和'LogMemoryLeaksToFile'设置重建项目,并将FullDebugMode DLL与EXE放在同一文件夹中。除了对话框之外,这将生成一个文件,其中包含程序shtudown中内存泄漏的详细信息。这里最有用的信息是每个分配的部分堆栈跟踪。

获得此信息后,您可以开始修复内存泄漏。对此有一点诀窍:请记住,对象所有权通常看起来很像树:一个对象拥有其他对象,每个对象都拥有其他对象,依此类推。因此,您首先要查找的是具有最小泄漏数量的泄漏类型,因为这可能是树的根。

例如,如果报告显示您泄漏了一个TObjectList和1000个TMyObject个实例,则很可能会将这些TMyObject个实例分配给该列表,而您只是忘了释放列表。修复将清除整个报告,所以在你排除其他事情之前不要去寻找各个子对象。

答案 1 :(得分:7)

执行此操作的最佳方法是让工具指出导致泄漏的分配位置。为此,您需要下载并使用FastMM的完整版本。 Delphi提供的版本没有这种功能。

使用完整的FastMM时,将生成一份报告,其中包含您需要的所有血腥细节,包括堆栈跟踪,以告诉您泄漏了哪些代码。