[fpc-pascal] PChar -> AnsiString -> PChar = memory leak?

Martin lazarus at mfriebe.de
Thu Oct 29 14:09:30 CET 2009


Graeme Geldenhuys wrote:
> Hi,
>
> Do I create a memory leak if I cast a PChar it a AnsiString. Then
> append text to the AnsiString and then cast it back to the original
> PChar?
>
> eg:
> var
>   Text: Pchar;    <-- global var containing text.
>
> procedure AppendText(const AText: string);
> var
>   s: string;
> begin
>   s := Text + AText;
>   Text := PChar(s);
> end;
>   

I don't think a memory leak. But a problem yes.

Text will have random content afterwards!
>   s := Text + AText;
>   
"s" will be the new string. => new memory allocated
>   Text := PChar(s);
>   
"Text" will be a pointer to the memory allocet by "s"

At the end of the procedure "s" will be freed (because it's a local 
string, so it has no longer any references)
"Text" will then point to unallocated memory (still holding the string) 
=> but as soon as your program does anything, the memory may be reused, 
and "text" points to random data.

If PChar points to a string, then the strig must be kept as long as 
pchar is used. (I run into that issue myself, last year....)

Martin




More information about the fpc-pascal mailing list