在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”。