3

是否可以使用该程序注册接口RegisterExpectedMemoryLeak

我有一个私有字段声明为:

FDragDropTarget: IDropTarget;

然后我创建一个实例并尝试为这个对象注册一个已知的内存泄漏:

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

但是,我收到一个编译器错误,指出存在不兼容的类型:“Pointer”和“IDropTarget”。对我来说,我的接口实例还是一个指针?

那我可以这样做吗?它是通过 ReportMemoryLeaksOnShutdown := 我在 .dpr 文件中的 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 回答