【发布时间】:2009-06-24 00:13:28
【问题描述】:
我继承了一个 Intraweb 应用程序,该应用程序有一个 2MB 的内存泄漏文本文件,由 FastMM4 报告。我已经把它归结为一个类的 115 个实例泄漏 52 个字节。
对坏演员的简要描述是:
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)
【问题讨论】:
-
等一下……你在说什么接口属性?这里没有属性。
-
我们需要 GetAdapterNav 的代码,以查看对象/接口是如何创建的。另外,调用它的代码,看看它是如何被处理的。
-
是的,你是对的。它不是属性,而是检索适当接口实现的内部工作者。
-
抱歉,发布函数时遇到问题。
-
函数 TCwcBasicAdapter.GetAdapterNav(aDataSet: TDataSet): ICwcCDSAdapterNav; var AdapterNav: TCwcCDSAdapterNavBase;开始结果 := nil;如果已分配(aDataSet),则开始 AdapterNav := TCwcCDSAdapterNavBasic.Create(aDataSet, FKeyField.Index, FNavTitleField.Index);尝试 AdapterNav.GetInterface(ICwcCDSAdapterNav,结果);除了 FreeAndNil(AdapterNav);增加;结尾;结尾;结尾;类声明为:TCwcCDSAdapterNavBase = class(TInterfacedObject, ICwcCDSAdapterNav)
标签: delphi interface memory-leaks delphi-2009 intraweb