2012-09-23 29 views
3

是否可以使用RegisterExpectedMemoryLeak過程註冊接口?如何爲接口對象註冊預期的內存泄漏

我有一個私有字段聲明爲:

FDragDropTarget: IDropTarget; 

我然後創建一個這樣的實例,並嘗試註冊此對象的一個​​已知的內存泄漏:

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

不過,我得到一個編譯器錯誤,指出存在不兼容的類型:'指針'和'IDropTarget'。對我來說,我的界面實例是一個指針嗎?

那麼我可以這樣做嗎?它是通過ReportMemoryLeaksOnShutdown:= True語句在我的.dpr文件中報告的。

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

TDropTarget是我實現接口下降目標的:

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

感謝

回答

5

這並不是說漏接口,但對象實現它。所以,我認爲這是一個需要註冊一個:

FDragDropTargetObj: TDropTarget; 
FDragDropTarget: DropTarget; 


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

謝謝。我想到了類型轉換,但並不確定舊的「不要混合接口和對象引用」,但是鑑於你和David都提供了相同的解決方案,它必須是正確的! – Jason

+0

是的。你說的不是混合......但在這種情況下你不會。你所要做的就是向一塊內存註冊一個匿名指針,讓內存管理器檢查內存是否被釋放。它實際上與對象或接口無關。這是他們從未告訴你的例外之一。 ;) – GolezTrol

2

您需要註冊的實施對象,而不是接口,因爲這是泄露認爲:

RegisterExpectedMemoryLeak(FDragDropTarget as TObject); 

事實上,這對象泄漏意味着你的引用計數被破壞了。我可能會考慮解決潛在的問題而不是壓制它。

+0

該字段應該已被聲明爲「TDropTarget」才能正常工作。但那麼就不會有問題了。 –

+2

@Sertac爲什麼這不起作用?接口可以轉換爲實現對象。 –

+0

從D2010開始,我一直無法做到這一點。對不起。 –