On Fri, Apr 19, 2013 at 1:36 AM, Xiangrong Fang <xrf...@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
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to