为什么调试器在 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".
在 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".