【发布时间】:2012-01-12 14:04:11
【问题描述】:
我最近发现 Delphi 有一个名为 ReportMemoryLeaksOnShutdown 的全局变量,当设置为 True 时会在应用程序关闭时检测内存泄漏。我从另一个相关问题上阅读了一些 cmets 发现了这些信息:What is the best tool to detect memory leaks in Delphi
所以我从项目源中输入ReportMemoryLeaksOnShutdown := True;
现在,当我的应用程序关闭时,它会发现大量内存泄漏。我的直接想法是检查创建的对象是否被正确释放(try..finally..free 等)。
我已经检查了代码,但看不到泄漏可能来自哪里,现在我需要找到它们,因为如果在退出应用程序时报告内存泄漏,那么这非常意味着内存泄漏运行时,它会变大并且很糟糕!
从上面的链接中推荐了 3rd 方工具,例如 Eureka Log。有没有办法只使用 IDE 和调试器来帮助我找到并修复问题区域?
更新
我设法摆脱了大约 6 次内存泄漏,我发现这与 MDI Childs 有关。子级在列表框中保存了一些指针数据,当主应用程序关闭时,它没有正确释放子级,现在已修复。
我现在有这两个错误:
我发现这篇帖子 http://fgaillard.com/2011/02/when-the-debugger-leaks/ 可能表明调试器出现了我的上述错误?
【问题讨论】:
-
也许没有真正的泄漏,但您之前分配的一些静态对象仍在内存中,而应用程序关闭。
-
首先要注意的是,如果创建基于 TComponent 的对象(包括控件)总是将父控件传递给构造函数,则无需担心它们。 Delphi 负责为您发布这些内容。但是,如果您有任何 TPersistent 或 TObject 后代,则需要手动释放它们。泄漏报告对话框应该告诉你负责泄漏的类名!
-
我只看到 UnicodeString 泄漏,当应用程序在关闭时访问冲突从不显示(本质上应用程序没有正确退出,它强制自身关闭以抑制访问冲突消息)。检查以确保您没有释放已经释放的对象!根据我的经验,这是一个常见的原因!
-
我认为它会从工具提示中泄漏字符串。不管。在没有调试器的情况下运行,如果您仍然看到这些泄漏,那么它们是真实的。
标签: delphi memory-leaks