[fpc-pascal] Freeing memory with exceptions

Steve Litt slitt at troubleshooters.com
Mon May 22 20:34:25 CEST 2023


Michael Van Canneyt via fpc-pascal said on Sun, 21 May 2023 09:47:15
+0200 (CEST)

>On Sun, 21 May 2023, Hairy Pixels via fpc-pascal wrote:
>
>> I've never really used exceptions myself in Pascal (with the
>> exception of breaking out of deeply recursive function calls) so I
>> don't know all the rules.
>>
>> In this example lets say you call Test() which allocates some memory
>> and then calls out to another function in another unit which raises
>> (the programmer doesn't know this because FPC doesn't mark the
>> function as throwing exceptions).  Now the Test() function will exit
>> early before freeing the memory.
>>
>> What are you supposed to do here?  The only thing I can think of is
>> to wrap every function in try..finally which COULD raise an
>> exception but that's a huge mess because literally any function
>> could raise.
>>
>> ====================================
>>
>> procedure DoThis;
>> begin
>>  raise Exception.Create('dead');
>> end;
>>
>> procedure Test;
>> begin
>>  TObject.Create;
>>  // call some code in other unit which raise an exception
>>  DoThis;
>> end;  
>
>Your example will leak memory in any case, even if there is no
>exception, since you're not freeing the object anywhere..
>
>Assuming the result of A is not used outside of Test, the following is
>the only solution:
>
>procedure Test;
>
>var
>  A : TObject;
>begin
>   A:=TObject.Create;
>   Try
>     // call some code in other unit which raise an exception
>     DoThis;
>   finally
>     A.Free
>   end;
>end;
>
>You can try to use interfaces, they will be managed by the compiler.
>
>Alternatively, using generics and management operators you can 
>create a record that will automatically free the object at the 
>end of the procedure.
>
>Michael.

Am I correctly understanding you that Pascal objects come off the heap
and not the stack by default? Ouch! This is one of the C-isms I'd like
to get away from. Is there a way to create objects from stack memory
so there's no need to free?

NOTE: I've only rarely used OOP in Pascal.

Thanks,

SteveT

Steve Litt 
Autumn 2022 featured book: Thriving in Tough Times
http://www.troubleshooters.com/bookstore/thrive.htm


More information about the fpc-pascal mailing list