我最近发现Delphi有一个名为ReportMemoryLeaksOnShutdown的全局变量,当设置为True时,将检测应用程序关闭时的内存泄漏.我发现这些信息来自于阅读另一个相关问题的一些评论:什么是检测Delphi内存泄漏的最佳工具
所以从我投入的项目来源 ReportMemoryLeaksOnShutdown := True;
现在,当我的应用程序关闭时,它会消耗大量的内存泄漏.我的直接想法是检查创建的对象是否正确释放(try..finally..free等).
我已经查看了代码,我无法看到泄漏可能来自哪里,现在我需要找到它们,因为如果在退出应用程序时报告内存泄漏那么这意味着运行时存在内存泄漏,会变大,而且很糟糕!
从上面的链接推荐第三方工具,如Eureka Log.有没有办法只使用IDE和调试器来帮助我找到并修复问题区域?
UPDATE
我设法摆脱了大约6次内存泄漏,我发现它与MDI Childs有关.孩子们在列表框中持有一些指针数据,当主应用程序关闭时,它没有正确释放孩子,现在已经修复了.
我现在留下了这两个错误:

我发现这篇文章http://fgaillard.com/2011/02/when-the-debugger-leaks/这可能表明调试器出现上述错误?
Mas*_*ler 19
首先,确保您获得FastMM的完整版本.它有一些额外的功能,例如FullDebugMode,它们将在这里帮助你.使用FullDebugMode编译器选项中定义的"LogMemoryLeaksToFile"设置和与EXE相同的文件夹中的FullDebugMode DLL 重建项目.除了对话框之外,这将生成一个文件,其中包含程序shtudown中内存泄漏的详细信息.这里最有用的信息是每个分配的部分堆栈跟踪.
获得此信息后,您就可以开始修复内存泄漏.对此有一点诀窍:请记住,对象所有权通常看起来很像树:一个对象拥有其他对象,每个对象都拥有其他对象,依此类推.因此,您首先要查找的是具有最小泄漏数量的泄漏类型,因为这可能是树的根.
例如,如果报告显示您正在泄漏一个TObjectList和1000个TMyObject实例,则可能是这些TMyObject实例已分配给列表而您忘记释放列表.修复将清除整个报告,所以在你排除其他事情之前不要去寻找各个子对象.
执行此操作的最佳方法是让工具指出导致泄漏的分配位置.为此,您需要下载并使用FastMM的完整版本.Delphi提供的版本没有这种功能.
使用完整的FastMM时,将生成一份报告,其中包含您需要的所有血腥细节,包括堆栈跟踪,以告诉您泄漏的代码段.
| 归档时间: |
|
| 查看次数: |
6831 次 |
| 最近记录: |