[fpc-pascal] Basic question about TStringList

Crause, Christo (JC) christo.crause at sasol.com
Fri Mar 28 07:45:23 CET 2008

> From: g.marcou at chimie.u-strasbg.fr

> As a consequence I have another question. Suppose I have a function  
> that returns a TStringList:
> Myfunction(): TStringList;
> I must have inside a line like:
> Result:=TStringList.Create;
> Let A be a TStringList, I have two ways to catch the result 
> of my function:
> A:=Myfunction();
> or
> A.Assign(Myfunction());
> In the first case, if do A.Free, I release the memory 
> allocated by the  
> function. What's arriving in the second case? I can do A.Free, but  
> does that action will also release the memory allocated by 
> the function?
> By the way, do you have some tricks to detect this kind of error?

This consequence of returning references to newly created objects is a
very subtle one and I have seen some spectacular memory leaks caused by
this practice.  My programming convention is to try to always call
and .Free in the same context if possible i.e.

procedure Myfunction(const ASL: TStringList);
// add stuff to ASL

And in code using this function:

SL := TStringList.Create;
// do stuff

Not quite bullet proof yet, since one can call Myfunction without
instantiating SL, but at least that should give you a runtime error that
should be easy to trace.

Christo Crause
NOTICE: Please note that this eMail, and the contents thereof, 
is subject to the standard Sasol eMail legal notice which may be found at: 

If you cannot access the legal notice through the URL attached and you wish 
to receive a copy thereof please send an eMail to 
legalnotice at sasol.com

More information about the fpc-pascal mailing list