gpt4 book ai didi

delphi - 修复内存泄漏

转载 作者:行者123 更新时间:2023-12-03 18:00:27 24 4
gpt4 key购买 nike

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

所以我从项目源代码中输入 ReportMemoryLeaksOnShutdown := True;

现在,当我的应用程序关闭时,它会发现大量内存泄漏。我的直接想法是检查创建的对象是否已正确释放(尝试..最终..释放等)。

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

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

更新

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

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

enter image description here

我找到了这篇文章 http://fgaillard.com/2011/02/when-the-debugger-leaks/这可能表明调试器对我的上述错误有错误?

最佳答案

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

获得这些信息后,您就可以开始修复内存泄漏了。这有一点技巧:请记住,对象所有权通常看起来很像一棵树:一个对象拥有其他对象,这些对象又拥有其他对象,依此类推。因此,您首先要寻找的是泄漏次数最少的泄漏类型,因为它很可能是树的根。

例如,如果报告说您正在泄漏一个 TObjectList 和 1000 个 TMyObject 实例,那么这些 TMyObject 实例很可能已分配到列表,你只是忘了释放列表。解决这个问题会清除整个报告,所以在排除其他问题之前不要四处寻找单个子对象。

关于delphi - 修复内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8375028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com