メモリリークを引き起こすイベントサポート付きの自動化オブジェクトがあります。生成されたソースに付属するFConnectionPointsが解放されることはありません。デストラクタにFConnectionPoints.Freeを手動で追加すると、リークがなくなります。
FastMMBorlandMM.dllとFastMM_Fulldebugmode.dllを使用してDelphi7を使用しています。
再現する手順:
- 新しいActiveXライブラリプロジェクトを開始します
- 新しい自動化オブジェクトを追加します。Name=TestObject; 「イベントサポートコードの生成」にチェックを入れます
- TypeLibraryを開き、ITestObjectにメソッドを追加し、ITestObjectEventsにイベントを追加します
- 更新すると、コードが生成されます。
- .dprファイルの最初のユニットとしてShareMemを追加します
- このActiveXサーバーを保存、コンパイル、登録します([実行]メニュー)
- 新しいアプリケーションプロジェクトを開始します
- ShareMemを.dprファイルの最初のユニットとして配置します
- タイプライブラリユニットのインポート:手順6で作成したdllからユニットを作成し、[コンポーネントラッパーの生成]をオンにします。
- FormCreateに、次のコードを追加します。
コード:
var
lTest: TTestObject;
begin
lTest := TTestObject.Create(nil);
try
lTest.ConnectKind := ckNewInstance;
lTest.Connect;
lTest.Disconnect;
finally
lTest.Free;
end;
end;
次に、このアプリケーションをコンパイルして実行し、閉じます。メモリリークが報告されます。
質問:
これはDelphiコードテンプレートのバグですか、何か間違ったことをしていますか、それともFConnectionPointsを自分で解放することを目的としていますか(ヘルプには記載されていません)?