加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi 2009 – 接口属性是否会导致内存泄漏?

发布时间:2020-12-15 09:37:26 所属栏目:大数据 来源:网络整理
导读:我继承了一个Intraweb应用程序,它有一个2MB的内存泄漏文本文件,如FastMM4所报告的那样.我已经把它归结为一个类泄漏了52个字节的115个实例. 坏演员的简要描述是: TCwcBasicAdapter = class(TCwcCustomAdapter) protected FNavTitleField: TField; function G
我继承了一个Intraweb应用程序,它有一个2MB的内存泄漏文本文件,如FastMM4所报告的那样.我已经把它归结为一个类泄漏了52个字节的115个实例.

坏演员的简要描述是:

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)

我吵了一棵错误的树,因为这个属性被引用计算了吗?在任何情况下,接口属性都可以防止类被破坏吗?

以下是上述方法的实现:

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 Field,只是一个返回Interface的方法,它是无害的.

编辑:没有看到你的Object的代码实现ICwcCDSAdapterNav,我们无法判断它是否确实是引用计数.
如果你不是从TInterfacedObject下降,很可能它不是引用计数,你不能依赖于这种自动释放…

您可能需要查看此CodeRage 2会话:Fighting Memory Leaks for Dummies.它主要说明如何使用FastMM来防止/检测Delphi中的内存泄漏.适用于D2007,但仍适用于其他版本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读