-1

メモリリークを引き起こすイベントサポート付きの自動化オブジェクトがあります。生成されたソースに付属するFConnectionPointsが解放されることはありません。デストラクタにFConnectionPoints.Freeを手動で追加すると、リークがなくなります。

FastMMBorlandMM.dllとFastMM_Fulldebugmode.dllを使用してDelphi7を使用しています。

再現する手順:

  1. 新しいActiveXライブラリプロジェクトを開始します
  2. 新しい自動化オブジェクトを追加します。Name=TestObject; 「イベントサポートコードの生成」にチェックを入れます
  3. TypeLibraryを開き、ITestObjectにメソッドを追加し、ITestObjectEventsにイベントを追加します
  4. 更新すると、コードが生成されます。
  5. .dprファイルの最初のユニットとしてShareMemを追加します
  6. このActiveXサーバーを保存、コンパイル、登録します([実行]メニュー)
  7. 新しいアプリケーションプロジェクトを開始します
  8. ShareMemを.dprファイルの最初のユニットとして配置します
  9. タイプライブラリユニットのインポート:手順6で作成したdllからユニットを作成し、[コンポーネントラッパーの生成]をオンにします。
  10. FormCreateに、次のコードを追加します。

コード:

var
  lTest: TTestObject;
begin
  lTest := TTestObject.Create(nil);
  try
    lTest.ConnectKind := ckNewInstance;
    lTest.Connect;
    lTest.Disconnect;
  finally
    lTest.Free;
  end;
end;

次に、このアプリケーションをコンパイルして実行し、閉じます。メモリリークが報告されます。

質問:

これはDelphiコードテンプレートのバグですか、何か間違ったことをしていますか、それともFConnectionPointsを自分で解放することを目的としていますか(ヘルプには記載されていません)?

4

2 に答える 2

1

自動化オブジェクトを操作したことがないので、質問を完全には理解していませんが、私が見る限りIConnectionPoint、インターフェースです。Delphiのインターフェイスは参照カウントされるため(実装がから継承する場合TInterfacedObjectTContainedObjectまたはTAgreggatedObject実装する場合) _AddRef_Releaseメモリリークは発生しません。

インターフェイスの詳細については、この記事を参照してください。

Delphi言語ガイドのこの章も役に立ちます。

于 2010-01-08T15:05:55.697 に答える
0

この問題は、Quality Centralレポート #1480で報告されていることがわかりました。

Sysop から新しいレポートを作成するように依頼されたので、レポート #81288を作成しました。

これは私の質問にも答えます。これはコード テンプレートのバグです。

于 2010-01-20T16:03:06.140 に答える