我最近发现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/这可能表明调试器因我的上述错误而出错?
首先,确保你得到FastMM的完整版。它还有一些额外的功能,例如FullDebugMode
,这会对您有所帮助。使用以下命令重建您的项目FullDebugMode
和编译器选项中定义的“LogMemoryLeaksToFile”设置,以及与 EXE 位于同一文件夹中的 FullDebugMode DLL。除了对话框之外,这还将生成一个文件,其中包含有关程序关闭时内存泄漏的详细信息。这里最有用的信息是每个分配的部分堆栈跟踪。
获得此信息后,您就可以开始修复内存泄漏。这有一个技巧:请记住,对象所有权通常看起来很像一棵树:一个对象拥有其他对象,每个对象又拥有其他对象,依此类推。因此,您首先要查找的是泄漏数量最少的泄漏类型,因为这可能是树的根。
例如,如果报告称您正在泄露一份TObjectList
和 1000TMyObject
实例,很可能那些TMyObject
实例已分配给列表,但您只是忘记释放列表。解决这个问题将清除整个报告,因此在排除其他事情之前不要四处寻找单个子对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)