为什么调试器在 for-in 循环中单步执行析构函数?

Why does the debugger step through a destructor in a for-in loop?

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

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<System.TObject>.TEnumerator".