[fpc-pascal] Functions with out parameters

Jonas Maebe jonas.maebe at elis.ugent.be
Mon Mar 10 14:56:27 CET 2008

On 10 Mar 2008, at 14:19, Damien Gerard wrote:

> If you have this, the showmessage display an empty string and  
> sometimes the app crashes. I had a doubt so I tried this :
> procedure AnotherMethod;
> var s, t: UTF8String;
> begin
>  s := 'Some text';
>  t := s;
>  Foo(t, s);
>  // Do something with `s`
> end;
> And it works well the app never crash and all my variables are  
> correct. So I guess the two parameters share the same pointer. It  
> seems logic to me in this case.

It's not really about the same pointer, but about the reference count.  
Ansistrings/UTF8Strings are reference counted. If you pass one as out  
parameter, then before the call the reference count of the out  
parameter is decreased before the call. If it had a reference count of  
only one, this will cause it to be freed at that point.

> However, is there a way the compiler produces an error in this case ?

It would only be possible in very few cases, where (like in your case)  
you are using the same literal expression twice (and even then it's  
only wrong if the reference count of the string pointed to by that  
expression is one). More often than not the problem is that the same  
string is passed in already via different var/const parameters, so the  
equality cannot be detected at a syntactic level.

> I suppose there is a similar case with the 'var' keyword.

In case of a var parameter, the reference count of the argument is not  
decreased in advance. There you can indeed still have the problem  
later on inside the body of the called function if you overwrite the  
var parameter and then still use the const parameter later on (again,  
if the passed argument had a reference count of 1).

More information about the fpc-pascal mailing list