3

RegisterExpectedMemoryLeakプロシージャにインターフェイスを登録することは可能ですか?

次のように宣言されたプライベートフィールドがあります。

FDragDropTarget: IDropTarget;

次に、このインスタンスを作成し、このオブジェクトの既知のメモリ リークを登録しようとします。

  FDragDropTarget := TDropTarget.Create(lcMain.Handle, FDragDrop);
  RegisterExpectedMemoryLeak(FDragDropTarget);

ただし、互換性のない型 'Pointer' と 'IDropTarget' があることを示すコンパイラ エラーが発生します。私にとって、私のインターフェースインスタンスはとにかくポインターですか?

それで、私はこれを行うことができますか?.dpr ファイルにある ReportMemoryLeaksOnShutdown := True ステートメントを介して報告されています。

begin
  ReportMemoryLeaksOnShutdown := True;
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

TDropTarget は、IDropTarget インターフェイスの私の実装です。

  TDropTarget = class(TInterfacedObject, IDropTarget)
  ...
  end;

ありがとう

4

2 に答える 2

5

リークするのはインターフェイスではなく、それを実装するオブジェクトです。だから私はそれが登録する必要があるものだと思います:

FDragDropTargetObj: TDropTarget;
FDragDropTarget: DropTarget;


FDragDropTargetObj := TDropTarget.Create(lcMain.Handle, FDragDrop); 
FDragDropTarget := FDragDropTargetObj;
RegisterExpectedMemoryLeak(FDragDropTargetObj);
于 2012-09-23T08:56:50.973 に答える
2

リークされていると思われるため、インターフェースではなく実装オブジェクトを登録する必要があります。

RegisterExpectedMemoryLeak(FDragDropTarget as TObject);

このオブジェクトがリークするという事実は、参照カウントが何らかの形で壊れていることを示唆しています。私はおそらく、根本的な問題を抑圧するのではなく、根本的な問題を解決しようとします。

于 2012-09-23T10:26:04.627 に答える