这是正常的吗?
for a := 1 to 10 do x.test; x.test; x.test; x.test; function test: string; begin {$IFDEF DEBUG} DebugMessage('result check = '+Result,3); {$ENDIF} result := result + 'a'; end; 10:39:59: result check = 10:39:59: result check = a 10:39:59: result check = aa 10:39:59: result check = aaa 10:39:59: result check = aaaa 10:39:59: result check = aaaaa 10:39:59: result check = aaaaaa 10:39:59: result check = aaaaaaa 10:39:59: result check = aaaaaaaa 10:39:59: result check = aaaaaaaaa 10:39:59: result check = 10:39:59: result check = 10:39:59: result check =
在for循环期间,函数结果堆栈没有被释放? :o
解决方法
结果被视为函数的隐式var参数.
想象一下,如果你用这种方式明确地写出来:
procedure test(var result: string); begin result := result + 'a'; end; for i := 1 to 10 do test(s);
然后你会期望它附加到s.
每次调用时都丢弃Result的事实是编译器有时决定最终确定它的原因.正如@gabr指出的那样,它选择在循环内部作为优化时不完成此隐式变量.
如果您每次调用test时都将测试结果分配给一个字符串,那么每次都会看到字符串变长,它永远不会被重新初始化.
这就是您应该始终初始化结果变量的原因.它看起来像一个局部变量,但最好将其视为var参数.