[fpc-pascal] methods of an object to create others objects

Marcos Douglas md at delfire.net
Mon Jul 5 22:03:24 CEST 2010


Hi Martin

On Mon, Jul 5, 2010 at 4:33 PM, Martin <fpc at mfriebe.de> wrote:
> On 05/07/2010 19:48, Marcos Douglas wrote:
>>
>> We can to use methods of an object to create others objects, or this
>> is a bad programming practice?
>> eg:
>> var
>>   obj1, obj2: TmyObject;
>> begin
>>   obj1 := tobj1.create; //ok
>>   obj2 := obj1.createObj; // is this recommended?
>>
>
> This is used very often like this, so yes this is fine.
>
>>   try
>>   //...
>>   finally
>>     obj1.free;
>>     obj2.free;
>>   end;
>> end;
>>
>> Why I ask this:
>> If not exists the variable obj2 in call obj1.createObj will happen a
>> memory leak, right? Because there is not variable to release.
>>
>
> Not exactly sure what you mean?
>
> There are 2 problems that can happen:
>
> 1)
> "obj1.createObj" returns no object and obj2 will be nil, then of course
> calling obj2.foo would crash.
> If "obj1.createObj"  can return nil, then you must check for this.
>
> 2)
> "obj1.createObj" crashes, then you are still before the try, and obj1 will
> not be freed => so yes leak

None of these problems will happen, because I treat all them.

> You can either do 2 nested try finally, or the following:
>
> var
>  obj1, obj2: TmyObject;
> begin
>  // make sure they are both initialized
>  // obj1.free works correct, if obj1 is nil
>  obj1 := nil;
>  obj2 := nil;
>  try
>    obj1 := tobj1.create;
>    obj2 := obj1.createObj;
>  //...
>  finally
>    obj1.free;
>    obj2.free;
>  end;
> end;

I use this technique a lot, but thanks :)  Unfortunately, this is not
the *problem*.

The ask is:
If a function creates, inside, a object and there is no variable to
receive this pointer, will happen a memory leak?

In my eg before, this is Okay:
obj2 := obj.createObj;

The obj2 is a pointer to release.

But, like that:
obj1.createObj; //no variable to receive

...now, where is the pointer to release?


Marcos Douglas



More information about the fpc-pascal mailing list