在Delphi XE7(我使用RAD Studio)中,我尝试调试包中的代码。我遇到无法解释的奇怪情况。例如,我有一个类似于以下功能的函数(请注意,该函数没有任何智能功能,请不要更正它,因为我不在现实世界中使用它。它只是一个虚拟函数,用于说明问题我面对。)

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 ++项目中调用了该函数。

问候

最佳答案

被销毁的TObject是由编译器为For-In循环隐式创建的Enumerator。它不是“ pProperty”。如果在TObject.Destroy的开头停止调试器时调出一个Evaluator,然后输入“ self.classname”,则会看到它是“ TList .TEnumerator”。

09-17 23:01