hik*_*ari 5 delphi stack function
这是正常的吗?
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 =
Run Code Online (Sandbox Code Playgroud)
在for循环期间,函数结果栈是不是被释放了?:o
Result被视为var函数的隐式参数.
想象一下,如果你用这种方式明确地写出来:
procedure test(var result: string);
begin
result := result + 'a';
end;
for i := 1 to 10 do
test(s);
Run Code Online (Sandbox Code Playgroud)
然后你会期望它附加到s.
Result每次调用它时都会丢弃的事实是编译器有时决定最终确定它的原因.正如@gabr指出的那样,它选择在循环内部作为优化时不完成此隐式变量.
如果你test每次调用时都将结果赋给一个字符串,那么每次test都会看到字符串变长,它永远不会被重新初始化.
这就是您应该始终初始化结果变量的原因.它看起来像一个局部变量,但它最好被认为是一个var参数.
那么,你应该总是初始化函数结果.不要以为它将被设置为正确的值,因为它是动态的(在本例中为字符串)类型.