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).
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to