2017-03-06 56 views
2

在Delphi XE7中(我使用RAD Studio),我嘗試調試一個包內的代碼。我遇到了一個我無法解釋的奇怪情況。例如,我有一個類似如下(注:知道一個函數,這個函數什麼也不做智能,請因爲我沒有在現實世界中使用它不糾正它。這只是一個虛擬函數說明我所面臨的問題。)爲什麼調試器在for-in循環中遍歷析構函數?

procedure TMyClass.DemoFunc(); 
var 
    pTest:  TObjectList<TObject>; 
    pProperty: TObject; 
begin 
    pTest := TObjectList<TObject>.Create; 

    for pProperty in pTest do 
     pProperty.ToString; 

    pTest.Free; 
end; 

當調試上面的代碼中,我注意到,調試上線

pProperty.ToString; 

如果我嘗試跟蹤到上述線路進入,我跳到

destructor TObject.Destroy; 

但是從我的角度來看,它完全不合邏輯,因爲pTest顯然是空的,所以上面的行不應該被調用。

有人能向我解釋這種奇怪的行爲?

注意我試圖調試的代碼是在Delphi包中,但函數是從C++項目調用的。

問候

+1

它讓我感到困惑,Emba決定使用堆分配枚舉器來爲其基本集合。就好像開發人員不瞭解堆的成本影響。 –

+0

所以這可能是一個使用for-to循環代替的有效理由? –

+1

大部分沒關係。但是如果你在大型機器上執行嚴肅的多線程代碼,那麼內存管理器爭用可能是一個問題。 –

回答

7

的TObject的被破壞是隱含地由編譯器的for-in循環中創建的枚舉。這不是「pProperty」。如果您在調試器停在TObject.Destroy的開始,進入「self.classname」彈出一個計算器,你會看到,這是一個「從TList <System.TObject> .TEnumerator」。