gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:56:06 26 4
gpt4 key购买 nike

我们遇到了内存泄漏问题,该问题仅在应用程序运行时发生(关闭应用程序时没有 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/

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