delphi - Delphi 7 和 Delphi 2007 中接口(interface)的区别

标签 delphi interface memory-leaks delphi-7 delphi-2007

我们遇到了内存泄漏问题,该问题仅在应用程序运行时发生(关闭应用程序时没有 FastMM 报告)。

我们将问题隔离到从数据库读取值并从结果中实例化对象的方法。 (我们使用 DBXPress 来连接数据库)

执行数据库操作的类实现一个接口(interface)。 使用除了运行从数据库读取值(始终相同的值)的线程之外不执行任何其他操作的测试应用程序,Delphi 7 中的应用程序不会泄漏。但在 Delphi 2007 中,内存使用量跳跃得非常快。这是相同的代码,相同的测试应用程序。

当您使用 AQTime 检查应用程序时,您可以看到 TStringList、TList 等(数据库类使用的所有对象)的数量增长和收缩 - 但使用 ProExplorer 和 Windows 任务管理器(Delphi 2007 版本)检查内存成长得非常快。

我们唯一的猜测是Delphi 7 和Delphi 2007 处理接口(interface)发布的方式有所不同。是否有意义?有人经历过类似的事情吗?

最佳答案

嗯...我的 2 美分:

delphi 2007 使用界面的方式没有什么不同。但很久以前,我在接口(interface)方面遇到了类似的问题,最终我根本没有使用接口(interface)引用计数。它的效果不太好。

您没有发布源代码,但我猜您实现该接口(interface)的对象继承自 TInterfacedOject,对吗?如果是这样,请考虑将其更改为您自己的 TInterfacedObject,该对象不会实现引用计数方法。你将不得不销毁你的对象,而不是让 delphi 处理它们。

您可能考虑的另一件事是通过将 nil 设置为您不使用的接口(interface)对象来告诉 delphi 您不再需要该接口(interface)对象。

但正如每个人在评论中所说,如果 fastmm 没有报告泄漏,则根本没有泄漏。内存快速增长的事实并不表明您的程序正在泄漏。它只是说你没有按照你想要的方式关注你的物体。

您应该使用EurekaLog 。这是一个非常好的插件,可以报告内存泄漏及其调用堆栈。

另外,看看这个 Question

关于delphi - Delphi 7 和 Delphi 2007 中接口(interface)的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5333433/

相关文章:

windows - 如何有效地检索目录中的文件数?

php - 接口(interface)的使用

c# - 我把所有这些接口(interface)放在哪里?

ios - NSString 的内存管理问题

golang websocket内存泄漏

delphi - 如何复制 Delphi TTable 及其计算字段?

ios - 如何创建一个 UIBackgroundTask 以在应用程序处于后台时发送数据?

delphi - Windows Message lparam转换

java - 在接口(interface)和抽象类中访问同名值-Java

ios - 使用 ARC 从 NSURL 和 AVAudioPlayer 泄漏