[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