![]() |
Der Konstruktor ist abgestürzt - Wie gehe ich im Destruktor am besten vor?
Es ist einer der Fälle, der nicht passieren sollte. Ähnliches habe ich schonmal in Sachen Beenden abgestürzter Threads angestoßen ("
![]() Folgende Annahme: Der Konstruktor eines Objekts läuft nicht durch, irgendwo mittendrin fliegt er mit einer Exception raus. Wenn ich es richtig verstanden habe, wird nun das Exception-Objekt erzeugt, der Destruktor des Objekts aufgerufen und anschließend die Exception "nach oben gereicht". Es geht um den Destruktor: Hier muss man nun aufpassen, keine Objekte zu zerstören die vom Konstruktor noch nicht angelegt worden sind. Wie handelt Ihr hier?
Ich bin gespannt 8-) |
AW: Der Konstruktor ist abgestürzt - Wie gehe ich im Destruktor am besten vor?
Davon ausgehend, dass es sich bei den angesprochenen Objekten um private Felder der eigenen Klasse handelt, musst Du nichts weiter beachten. Diese sind initial nil, wenn Du sie also im Destruktor mit Free freigibst, passiert nichts, da Free erst auf nil prüft und dann erst Destroy aufruft. Daraus folgt: was nicht da ist, wird auch nicht versucht freizugeben.
|
AW: Der Konstruktor ist abgestürzt - Wie gehe ich im Destruktor am besten vor?
Tatsächlich. Ich bin durcheinandergekommen da der Debugger bei einer Exception im Konstruktor einen mit F7 nicht mehr durch den Destruktor wandern lässt soweit man nicht explizit einen Haltepunkt dort hineinsetzt.
Ich rede wirres Zeug, belassen wir es damit ;-) |
AW: Der Konstruktor ist abgestürzt - Wie gehe ich im Destruktor am besten vor?
Vllt bin ich jetzt auf dem falschen Dampfer, aber was spricht gegen
Delphi-Quellcode:
?
FreeAndNil
|
AW: Der Konstruktor ist abgestürzt - Wie gehe ich im Destruktor am besten vor?
Im Prinzip nichts, aber Free genügt in diesem Falle auch.
|
AW: Der Konstruktor ist abgestürzt - Wie gehe ich im Destruktor am besten vor?
.. freeAndNil erzeugt eine Exception wenn die freizugebene Instanz nicht mehr existiert.
Grüße Klaus |
AW: Der Konstruktor ist abgestürzt - Wie gehe ich im Destruktor am besten vor?
Zitat:
|
AW: Der Konstruktor ist abgestürzt - Wie gehe ich im Destruktor am besten vor?
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} uses SysUtils; type TMyBuggyObject = class PrivObject1: TObject; PrivObject2: TObject; constructor Create; destructor Destroy; override; end; constructor TMyBuggyObject.Create; begin Writeln('TMyBuggyObject.Create(): Allocating object1'); PrivObject1 := TObject.Create; Writeln('TMyBuggyObject.Create(): Throwing exception'); raise Exception.Create('TMyBuggyObject.Constructor - selfdestruct'); Writeln('TMyBuggyObject.Create(): Allocating object2'); PrivObject2 := TObject.Create; end; destructor TMyBuggyObject.Destroy; begin Writeln('TMyBuggyObject.Destroy(): Im being called.'); Writeln('TMyBuggyObject.Destroy(): PrivObj1=0x' + IntToHex(integer(PrivObject1), 8)); Writeln('TMyBuggyObject.Destroy(): PrivObj2=0x' + IntToHex(integer(PrivObject2), 8)); Writeln('TMyBuggyObject.Destroy(): Freeing both!'); PrivObject2.Free; PrivObject1.Free; inherited; end; procedure main; var Instance: TMyBuggyObject; begin Instance := NIL; try Instance := TMyBuggyObject.Create; try Writeln('Maincode: No exception!'); finally Instance.Free; end; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Writeln('Address of instance:'#9'0x', IntToHex(integer(Instance), 8)); Readln; end; begin ReportMemoryLeaksOnShutdown := True; main; end.
Code:
TMyBuggyObject.Create(): Allocating object1
TMyBuggyObject.Create(): Throwing exception TMyBuggyObject.Destroy(): Im being called. TMyBuggyObject.Destroy(): PrivObj1=0x00520D10 TMyBuggyObject.Destroy(): PrivObj2=0x00000000 TMyBuggyObject.Destroy(): Freeing both! Exception: TMyBuggyObject.Constructor - selfdestruct Address of instance: 0x00000000 |
AW: Der Konstruktor ist abgestürzt - Wie gehe ich im Destruktor am besten vor?
Was willst du uns mit dem Code jetzt sagen?
|
AW: Der Konstruktor ist abgestürzt - Wie gehe ich im Destruktor am besten vor?
Ich dachte schon, ich sei der Einzige, der sich das fragt :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz