Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为什么调试器在for-in循环中单步执行析构函数?_Delphi_Debugging_For Loop_Empty List - Fatal编程技术网

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

Delphi 为什么调试器在for-in循环中单步执行析构函数?,delphi,debugging,for-loop,empty-list,Delphi,Debugging,For Loop,Empty List,在delphixe7(我使用radstudio)中,我尝试调试包中的代码。我遇到了一个无法解释的奇怪情况。例如,我有一个类似于下面的函数(注意我知道,这个函数没有任何智能功能,请不要更正它,因为我在现实世界中没有使用它。它只是一个虚拟函数来说明我面临的问题。) 过程TMyClass.DemoFunc(); 变量 pTest:TObjectList; 财产:托宾; 开始 pTest:=TObjectList.Create; 对于pTest do中的pProperty pProperty.ToStr

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

过程TMyClass.DemoFunc();
变量
pTest:TObjectList;
财产:托宾;
开始
pTest:=TObjectList.Create;
对于pTest do中的pProperty
pProperty.ToString;
免费考试;
结束;
当我调试上述代码时,我注意到调试器在第行输入

pProperty.ToString;
如果我试图追踪到上面这一行,我会跳到

析构函数TObject.Destroy;
但从我的观点来看,这是完全不合逻辑的,因为pTest显然是空的,所以上面的行永远不应该被调用

有人能给我解释一下这种奇怪的行为吗

<> > > < <强> >我尝试调试的代码在Delphi包内,但函数是从C++项目调用的。< /P>
要销毁的TObject是编译器为for-In循环隐式创建的枚举数。这不是“财产”。如果调试器在TObject.Destroy开始时停止时打开计算器并输入“self.classname”,您将看到它是一个“TList.TEnumerator”。

Emba决定对其基本集合使用堆分配的枚举器,这让我很恼火。这就好像开发人员不理解堆的成本含义一样。因此,这可能是使用for-to循环的一个有效理由?大多数情况下,这并不重要。但是,如果您在大型计算机上执行严重的多线程代码,那么内存管理器争用可能是一个问题。除非您使用的是更复杂的代码、多线程和大量内存消耗,否则可能并不重要