[fpc-pascal] string memory management

Flávio Etrusco flavio.etrusco at gmail.com
Fri Apr 19 07:53:59 CEST 2013


On Fri, Apr 19, 2013 at 1:36 AM, Xiangrong Fang <xrfang at gmail.com> wrote:
> Hi All,
>
> I'm studying how pascal manages strings.  I wrote a simple test program:
>
> program stringtest;
> {$mode objfpc}{$H+}
> uses Classes, sysutils;
> function test: PString;
> var
>   s : string;
> begin
>   New(Result);
>   Result^ := FloatToStr(Random);
> //  s := FloatToStr(Random);
> //  Result := @s;
> end;
> var
>   i : Integer;
> begin
>   Randomize;
>   with TList.Create do try
>     for i := 0 to 9 do Add(test);
>     for i := 0 to Count - 1 do begin
>       WriteLn(PString(Items[i])^);
>     end;
>   finally
>     Free;
>   end;
> end.
>
> The program runs fine, but:
>
> 1. I don't know whether I have to MANUALLY free memory for these strings to
> prevent leak?
> 2. Does the IDE provide any facility to analyze memory usage of a program
> and report if there are any leaks?  (There are Tools/Leak View, but I don't
> know how to get .trc file, or is it what I thought.
>
> Thanks.

I think this can answer a few questions:
http://www.freepascal.org/docs-html/ref/refsu12.html#x35-380003.2.6

AFAICS your code will leak both the String contents and the PString pointer.
You have to store the result from test() and call Finalize or assign
'' to it (actually its "dereference").

> var
>   i : Integer;
     p: PString;
> begin
...
>     for i := 0 to Count - 1 do begin
>       WriteLn(PString(Items[i])^);
         p := PString(Items[i]);
         p^ := ''; // or Finalize(p^);
         Dispose(p);
>     end;

Best regards,
Flávio



More information about the fpc-pascal mailing list