2017-03-06 5 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のが破壊されるため、ループのためのコンパイラによって暗黙的に作成された列挙です。これは "pProperty"ではありません。デバッガがTObject.Destroyの先頭で停止し、 "self.classname"と入力すると、Evaluatorを起動すると、 "TList <System.TObject> .TEnumerator"が表示されます。

関連する問題