我做類似的事情,在你的對象的析構函數下面的代碼將有助於
Destructor TMyObjectThatIAmDoingManualRefCounting.Destroy;
begin
if FMyRefCount<>0 then
messageDlg('You dork, you called Free on me when someone still had references to me');
inherited;
end;
那麼你至少可以找出你innapropriately釋放對象。可能你太早釋放它了。釋放對象太早實際上不會導致問題,它是當你釋放持有對已經釋放的對象的接口引用的對象時,你將得到錯誤。
您可以做的另一件事是在您的addref和release方法中放置斷點,並跟蹤誰在保持接口引用以及這些相同對象是否隨後釋放它們。
也是一個常見問題如下,如果你得到一個接口,並釋放對象相同的方法
var
o:TSomeObject;
begin
o:=TSomeObject.Create;
(o as ISomeInterface).DoSomething;
o.free
end;
這將導致在該方法的最後一個AV,因爲編譯器會創建一個假的在方法結束時釋放的接口變量。
,你需要做的這個
var
o:TSomeObject;
i:ISomeInterface;
begin
o:=TSomeObject.Create;
i:=(o as ISomeInterface); // or Supports or whatever
i.DoSomething;
i:=nil;
o.free
end;
我建議的免費使用,而不是破壞。 – Bharat 2010-06-29 09:27:53