Re: Throwing C'tor und new



Hallo Andreas,

"Andreas Heyer" <postbox@xxxxxxxxxxxxxxxxxxxxxxxxx> schrieb im Newsbeitrag
news:%23XLwqnl7IHA.4988@xxxxxxxxxxxxxxxxxxxxxxx
wie ist das Verhalten, wenn ich eine Objektinstanz per new anlegen will
und im Konstruktor des Objektes wird eine Ausnamhme geworfen? Da der C'tor
nicht vollständig abgearbeitet werden konnte, gilt das Objekt als nicht
erstellt und damit nicht existent.

Objekte hin oder her. Es geht um simplen Speicherbereich, der allokiert wird
und anschließend mit einem Konstruktor initialisiert wird. Das heißt, wenn
du im Konstruktor bist, ist der Speicher, und damit das Objekt, bereits
allokiert. Wenn du im Konstruktor etwas wirfst, und du kannst ja alles
werfen (Integers, Zeiger, ), dann bedeutet das nicht, daß dein Objekt
ungültig ist. Zum Glück gibt es keinen Compiler, der das falsch
interpretieren würde. Davon gehe ich mal aus. Zu jedem new/malloc gehört
auch ein delete/free.

Ich frage mich nun, ob das Standard-New daraufhin auch wieder den schon
geholten Speicher frei gibt? Dazu müsste es IMHO (oder wie auch immer das
implementiert wurde) um das Placement-New einen try-catch-Block bauen und
dann die Exception noch einmal werfen (re-throw).

Den try-catch mußt du selber bauen.

Aber auch wenn das Standard-New so vorgeht, steht es ja jedem frei, einen
eigenen new-Operator zu definieren. Ich frage mich jetzt aber auch, ob
sich die entsprechenden Designer des Problemes bewusst sind? Oder gibt es
da genaue Vorschriften?

Beim überschrieben new's wird wohl auch erst nach der kompletten Ausführung
deiner new-Funktion der Konstruktor ausgeführt. Das heißt, auch hier wäre
auch explizites try-catch und delete nötig, wenn im Konstruktor was geworfen
wird.

Gruß
Heiko


.



Relevant Pages

  • Re: Einfache Frage zur Initialisierung
    ... Speicher auch gleichzeitig eine Initialiserung vorgenommen wird. ... dann erfolgt die Initialisierung durch den Konstruktor der Klasse ... bzw. durch den Default-Konstruktor der Klasse bzw. der Oberklasse. ... dann werden die Elemente so initialisiert, ...
    (de.comp.lang.java)
  • Re: Throwing Ctor und new
    ... Das heißt, wenn du im Konstruktor bist, ist der Speicher, und damit das Objekt, bereits allokiert. ... Wenn du im Konstruktor etwas wirfst, und du kannst ja alles werfen (Integers, Zeiger,), dann bedeutet das nicht, daß dein Objekt ungültig ist. ... Wenn der Konstruktor eine Exception wirft, wie sollte das Objekt noch anzusprechen sein? ...
    (microsoft.public.de.vc)
  • Re: Dictionary und Speicherprobleme
    ... Collections sind selber relativ 'schlank', ... zu achten, etwa beim Konstruktor. ... Dafür bräuchte ich aber eine gute Hash-Funktion ... (denn nur so wird Speicher frei!) ...
    (microsoft.public.de.german.entwickler.dotnet.csharp)