[DUG] Dumb Friday Question

Conor Boyd Conor.Boyd at trimble.co.nz
Fri May 4 15:18:28 NZST 2007


Note for clarity, although I think we all understand this anyway.

What we're talking about here is a function returning _and handing off_
an object.

This is different to exposing an object (e.g. a StringList) as a
property of a class, e.g. the Items property of a combobox or similar.

In that case, the responsibility for managing the lifetime of the object
is clearly with the class exposing the property.

-----Original Message-----
From: delphi-bounces at delphi.org.nz [mailto:delphi-bounces at delphi.org.nz]
On Behalf Of Neven MacEwan

You guys don't consider a constructor a function then?

I think its totally stylistic, if you want to have functions returning
objects fine, just make it plain that they do,

IMHO

Neven
> I would endorse Rob's answer here.
>
> I don't consider it just a question of potential leaks, it's about 
> making the intentions of your code clear.
>
> The intention of who has the responsibility for object lifetime is 
> much, much clearer in Delphi if your caller creates the Stringlist 
> that it wants populated and frees it afterwards.
>
> I'd tend to make the method a boolean function for example, so you can

> test the result of your stringlist filling method; e.g.
>
> Function PopulateString(const sl: TStringList): Boolean; Begin
>   //Over-simplified example
>
>   if sl.Add('My String') then
>     Result := True;
> End
>
> HTH,
>
> Conor
>
> -----Original Message-----
> From: delphi-bounces at delphi.org.nz 
> [mailto:delphi-bounces at delphi.org.nz]
> On Behalf Of Robert martin
>
> Your code would leak.  You are creating an object and not freeing it.

> The calling function that retrieves the result must handle the freeing

> of the object.
>
> It might be clearer if you just change the function to a procedure 
> that takes a TStringList as a parameter.  i.e
>
> //Replacement procedure
> procedrue NewProc (sl :TStringList);
> begin
>     sl.Add('Blah Blah');
> end;
>
> //Calling procedure
> procedure call
> var
>     AStringList : TStringList;
> begin
>     AStringList := TStringList.Create;
>     try
>        NewProc(AStringLIst);
>
>        ......
>
>     finally
>        AStringList.Free;
>     end;
>
> end;
>
> Hope that helps :)
>
> Jeremy Coulter wrote:
>   
>> Hi All. This is a question that might be infulenced by some serious 
>> lack of sleep :-)
>>  
>> I have a funtion. Its return result is a TStringlist.
>> In my code I create a TStringlist then add my values to it, then pass

>> this to the RESULT varaible for the function.
>>  
>> Now,  this is prob. an obvious answer than I prob. do actually know, 
>> but if I got:-
>>  
>> sResult := TStringList.create;
>> sResult.add('blah');
>> Result:=sResult;
>>  
>> Then if I free sResult, then I loss the values I added, and the 
>> result
>>     
>
>   
>> is empty as you would expect.
>> But the issue I have is, so if I DONT free sResults, what happens to 
>> it? Surley it stays in memory,a dn I would end up with a memory leack

>> after repeaditive calls. Is that right? Or is because the variable is

>> function specific its free by default etc?
>> Its a basic question I know....but the more I thought about it the 
>> more uncertain I became....I really need some sleep so that prob. the

>> real probelm :-)



More information about the Delphi mailing list