Probieren wir doch mal ein bisschen herum. Dazu hab ich dein Programm ein kleines bisschen angepasst:
Code: Alles auswählen
program test;
{$MODE ObjFpc}
{$H+}
uses
heaptrc, classes, sysutils;
type
EMyException = class(Exception);
function BerechneFlaeche(A, B: Integer): Integer;
begin
If (A < 0) or (B < 0) then
raise EMyException.Create('blabla');
Result := A * B;
end;
begin
try
WriteLn(BerechneFlaeche(10, 2));
WriteLn(BerechneFlaeche(10, -1));
except
On E: EMyException Do begin
WriteLn(E.Message);
//E.Free;
end;
end;
WriteLn('Bye.');
end.
Wenn wir nun das ganze kompilieren und durchlaufen lassen, sagt uns die Ausgabe folgendes:
Code: Alles auswählen
20
blabla
Bye.
Heap dump by heaptrc unit
21 memory blocks allocated : 1189/1224
21 memory blocks freed : 1189/1224
0 unfreed memory blocks : 0
True heap size : 360448
True free heap : 360448
Wunderbar, kein reservierter Speicher, der nicht wieder freigegeben wird. Könnte man die gefangene Exception freigeben? Dazu entfernen wir die Auskommentierung aus der Zeile
Und die Ausgabe des neuen Kompilats:
Code: Alles auswählen
20
blabla
An unhandled exception occurred at $0805475F :
EAccessViolation : Access violation
$0805475F
Heap dump by heaptrc unit
25 memory blocks allocated : 1297/1344
23 memory blocks freed : 1261/1304
2 unfreed memory blocks : 36
True heap size : 425984
True free heap : 425808
Should be : 425832
Call trace for block $B7F4F048 size 24
$080555F0
$080557BD
$08089AE0
$080588A7
$08094D87
Call trace for block $B7F5F3B8 size 12
$08054852
$0808990E
$080588A7
$08094D87
Und siehe da, man sollte die Exception wohl nicht versuchen freizugeben.
Noch eine Schlussanmerkung:
theo hat geschrieben:Es gibt ja auch keine Instanzvariable, à la: raise InstVar:=EMyException.Create('blabla');
Doch die gibt es, allerdings nicht beim Werfen sondern beim Fangen der Exception:
E ist damit die Instanzvariable der gefangenen Exception.
hth
Michael