is this normal?
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 =
function result stack is not freed during a for loop? :O
Well, you should always initialize function result. Don't assume it will be set to proper value just because it is of a dynamic (in this case string) type.
Result
is treated as an implicitvar
parameter to your function.Imagine if you wrote it out explicitly this way:
Then you would expect it to append to
s
.The fact that you are throwing away
Result
each time you call it is why the compiler sometimes decides to finalise it. As @gabr points out, it elects not to finalize this implicit variable when inside a loop as an optimisation.If you were to assign the result of
test
to a string every time you calledtest
then you'd see the string get longer each time, it would never be re-initialized.This is why you should always initialize your result variable. It looks like a local variable, but it is best thought of as a
var
parameter.