gpt4 book ai didi

Delphi 2009 - 接口(interface)属性会导致内存泄漏吗?

转载 作者:行者123 更新时间:2023-12-03 15:20:43 25 4
gpt4 key购买 nike

我继承了一个 Intraweb 应用程序,该应用程序有一个由 FastMM4 报告的 2MB 内存泄漏文本文件。我已将一个类的 115 个实例减少到泄漏 52 字节。

对坏 Actor 的简要描述是:

TCwcBasicAdapter = class(TCwcCustomAdapter)  
protected
FNavTitleField: TField;
function GetAdapterNav(aDataSet: TDataSet): ICwcCDSAdapterNav; override;
public
constructor Create(aDataSource: TDataSource; aKeyField, aNavTitleField: TField; aMultiple: boolean);
end;

界面是:

  ICwcCDSAdapterNav = interface(IInterface)  

由于该属性是引用计数的,我是否找错了树?是否存在接口(interface)属性可以防止类被破坏的情况?

下面是上述方法的实现:

function TCwcBasicAdapter.GetAdapterNav(aDataSet: TDataSet): ICwcCDSAdapterNav;
var
AdapterNav: TCwcCDSAdapterNavBase;
begin
result := nil;
if Assigned(aDataSet) then begin
AdapterNav := TCwcCDSAdapterNavBasic.Create(aDataSet, FKeyField.Index, FNavTitleField.Index);
try
AdapterNav.GetInterface(ICwcCDSAdapterNav, result);
except
FreeAndNil(AdapterNav);
raise;
end;
end;
end;

类声明为:

TCwcCDSAdapterNavBase = class(TInterfacedObject, ICwcCDSAdapterNav)

最佳答案

FastMM 应该告诉您泄露的内容及其创建位置。
这将有助于缩小范围,找出真正的罪魁祸首:谁泄露了什么?

我不确定您的问题到底是什么?
您的代码不完整或不是有问题的代码:您的类没有 Interface 属性,也没有 Interface 私有(private)字段,只有一个返回 Interface 的方法,这是无害的。

编辑:如果没有看到对象实现 ICwcCDSAdapterNav 的代码,我们无法判断它是否确实是引用计数的。
如果您不是从 TInterfacedObject 继承有可能它没有引用计数,并且您不能依赖这种自动释放...

您可能想看看这个 CodeRage 2 session :Fighting Memory Leaks for Dummies 。主要展示了如何在Delphi中使用FastMM来预防/检测内存泄漏。适用于 D2007,但仍然与其他版本相关。

关于Delphi 2009 - 接口(interface)属性会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1035915/

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