[fpc-pascal] Freeing memory with exceptions
Michael Van Canneyt
michael at freepascal.org
Thu May 25 08:10:58 CEST 2023
On Thu, 25 May 2023, Hairy Pixels via fpc-pascal wrote:
>
>
>> On May 24, 2023, at 8:46 PM, Michael Van Canneyt via fpc-pascal <fpc-pascal at lists.freepascal.org> wrote:
>>
>> I see no problem, I am used to this.
>>
>> This is Pascal, you need to manage your memory and hence your references, this is true even in the absence of exceptions: In your example you would
>> also need to remember to remove your instance from the list after you free
>> it, even if there are no exceptions.
>
> My example is still not good. The problem I have is that once exceptions
> are used in a program calling any function now has a side effect of
> completely exiting the calling function so you need to be paranoid and
> wrap everything in try blocks just in case. A new added burden for manual
> memory management.
>
> Why is this better than handling errors as values like a normal function result?
Because it centralizes exit code in case of an error, and allows to have a
meaningful result.
In C you need to do something like this:
Function MyFunction(out theresult : TResultType) : Integer;
begin
Allocate A
...
error condition 1:
Free A, exit (1);
...
Allocate B
error condition 2:
Free A, Free B, exit(2)
Allocate C
error condition 3:
Free A, Free B, free C, exit(3);
...
// etc
// All went well, report 0
theresult:=X;
Free A, Free B, free C exit(0);
end.
(you can use a goto, which we all agree on is a bad idea to introduce in a
language)
With exceptions, this becomes
Function MyFunction : TResultType;
begin
try
Allocate A
..
allocate B
...
Allocate C
...
Result:=X;
finally
free A,B,C
end;
end.
I'll take the latter any time.
Michael.
More information about the fpc-pascal
mailing list