FastMM4によって報告されたメモリリークの2MBテキストファイルを持つIntrawebアプリを継承しました。1つのクラスの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)