我有一個類實現了一個接口,該接口可用於插件。 類的聲明很簡單。整個應用程序只有這個類的一個實例。當調用返回該接口的函數時,它會在檢索到的接口上調用_AddRef,然後將其作爲結果傳回。不幸的是,它工作,直到我嘗試釋放對象(請參閱「最終化」部分) - 它報告無效指針操作。如果我將它註釋掉,它可以正常工作(但FastMM會報告內存泄漏,所以對象不會被釋放)。Delphi7,傳遞對象的接口 - 釋放對象時導致無效指針操作
這是返回接口的函數中的代碼部分(實際上它是我的「服務管理器」類的重載QueryInterface)。
if ConfigManager.GetInterface(IID, obj) then
begin
ISDK_ConfigManager(obj)._AddRef;
result:= 0;
end
和CONFIGMANAGER類的代碼...
type
TConfigManager = class(TInterfacedObject, ISDK_ConfigManager)
private
...
end;
var
ConfigManager: TConfigManager;
implementation
...
initialization
ConfigManager:= TConfigManager.Create();
finalization
if ConfigManager <> nil then
FreeAndNil(ConfigManager); //if I comment it out, it leaks the memory but no Invalid Ptr. Op. raises
我在做什麼錯? 我需要通過一個參考這個 ConfigManager的實例。
TConfigManager.Destroy是做什麼的? – Ozan 2009-09-17 00:58:11
什麼都不會導致錯誤。確保我在發佈之前評論過它,並沒有幫助我... – migajek 2009-09-17 01:14:21
好的我發現*解決方法*,而不是*修復*。而不是調用FreeAndNil,我打電話._release ...但仍然在尋找答案! – migajek 2009-09-17 01:15:00