我最近偶然發現了一些我寫的非常舊的代碼造成的問題,顯然假設在with
語句中使用的接口引用會在with
- 塊留下時立即發佈 - 有點像隱含的try-finally
- 塊(類似於C#的using
-statement,如果我理解正確)。德爾福:從什麼時候接口引用不再在with-block結束時釋放?
顯然(在Delphi 2009中)這不是(不再是?)的情況。有誰知道這是什麼時候發生的?或者是我的代碼剛開始是錯誤的?
要澄清一下,這裏有一個簡單的例子:
type
IMyIntf = interface;
TSomeObject = class(TInterfacedObject, IMyIntf)
protected
constructor Create; override; // creates some sort of context
destructor Destroy; override; // cleans up the context created in Create
public
class function GetMyIntf: IMyIntf; //a factory method, calling the constructor
end;
procedure TestIt;
begin
DoSomething;
with (TSomeObject.GetMyIntf) do
begin
DoStuff;
DoMoreStuff;
end; // <- expected: TSomeObject gets destroyed because its ref.count is decreased to 0
DoSomethingElse;
end; // <- this is where TSomeObject.Destroy actually gets called
每當有人開始老「with
是邪惡的」的說法,這是永遠的一個例子,我腦子裏想這讓我繼續走下去「是的,但.. 「。似乎我錯了......任何人都可以確認嗎?
正確的,對象的創建範圍是它的主人,在程序這個案例。在上面的例子中,它應該在最後結束時被銷燬。任何其他行爲都會出乎意料,並且可能是D2009中糾正的錯誤。 – dverespey 2009-08-05 15:12:54
自從在Delphi 3中引入接口以來,行爲一直是一樣的。沒有任何錯誤被糾正。奧利弗只是錯誤地記得事情是如何運作的。又一個「帶」的例子導致意想不到的結果。 – 2009-08-05 17:21:09
我總是想象用''來創建一個匿名的,範圍很大的局部變量,它只存在於''with''塊中。對我來說,對於內存管理員來說,即使當你不能再訪問它時,對我來說似乎毫無意義... 鑑於(現在看起來:可悲地不正確)世界觀我認爲它完全有效期望引用計數在參考值超出範圍時立即遞減...... – 2009-08-06 11:25:49