我继承了一个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)
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) - user122603