[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