Destruktor im Konstruktor ??



  • Man schreibt einen try/catch Block wenn man eine Exception sinnvoll behandeln kann. Ansonsten lässt man sie weitersegeln.



  • Hast du das etwa auch übersehen?

    Hi schrieb:

    unique_ptr<tmp> uptr;
    try
    {
        uptr.reset(new temp(...));
    }
    

    Mit nem rohen Zeiger geht es genauso.

    Gibt es überhaupt eine möglichkeit ein Objekt oder Variable die in einem Try / Catch Block erzeugt wird, außerhalbe dieses Blockes zu benutzen?



  • trycatchnix schrieb:

    Gibt es überhaupt eine möglichkeit ein Objekt oder Variable die in einem Try / Catch Block erzeugt wird, außerhalbe dieses Blockes zu benutzen?

    Du hast es doch gerade selbst zitiert 😕



  • Also bleibt ein mit new erzeugtes Objekt oder dergleichen generell außerhalb des Try Blocks gültig?



  • trycatchnix schrieb:

    Also bleibt ein mit new erzeugtes Objekt oder dergleichen generell außerhalb des Try Blocks gültig?

    Vorrausgesetzt der Konstruktor throwt nicht, ja.



  • Ja, natürlich. Ein mit new erzeugtes Objekt existiert, bis es mit delete gelöscht wird.

    Vorrausgesetzt der Konstruktor throwt nicht, ja.

    In diesem Fall würde das Objekt ja nicht erzeugt.



  • Tja, dann ist ja alles klar. Danke!



  • Bashar schrieb:

    Ja, natürlich. Ein mit new erzeugtes Objekt existiert, bis es mit delete gelöscht wird.

    Vorrausgesetzt der Konstruktor throwt nicht, ja.

    In diesem Fall würde das Objekt ja nicht erzeugt.

    Nunja, aber, der Speicher wird Reserviert und der Konstruktor wird gestartet. Dazu kommt: Sobald nur ein einziger der deligierten Konstruktoren komplett durchläuft ohne zu throwen, gilt das Objekt als Konstruiert und der Destruktor darf aufgerufen werden (auch bei einem Throw in einem der nachfolgenden Konstruktoren).


  • Mod

    tkausl schrieb:

    Sobald nur ein einziger der deligierten Konstruktoren komplett durchläuft ohne zu throwen, gilt das Objekt als Konstruiert und der Destruktor darf aufgerufen werden (auch bei einem Throw in einem der nachfolgenden Konstruktoren).

    Soll heißen? Wenn ein delegierender Konstruktor wirft, wird das Objekt vom Compiler zerstört und die entsprechende Deallokationsfunktion aufgerufen. Wo ist da Spielraum für "Destruktor darf aufgerufen werden"?


  • Mod

    Ein mit new erzeugtes Objekt existiert, bis es mit delete gelöscht wird.

    auto p = new int;
    new (p) int;
    

    Ist gültiger Code, und das ursprüngliche Objekt existiert nicht mehr. (Hängt von der Definition des Worts "existieren" ab; Streng genommen lebt das Objekt nicht mehr.)



  • camper schrieb:

    Wo ist da Spielraum für "Destruktor darf aufgerufen werden"?

    Sorry falls das unklar war, ich meinte damit nicht, dass der Programmierer dann den Konstruktor aufrufen darf oder kann, sondern dass laut Standard der Destruktor vom Compiler aufgerufen wird, sobald nur einer der deligierten Konstruktoren erfolgreich durchlaufen ist und ein späterer dann throwt.



  • Arcoth schrieb:

    Ein mit new erzeugtes Objekt existiert, bis es mit delete gelöscht wird.

    auto p = new int;
    new (p) int;
    

    Ist gültiger Code, und das ursprüngliche Objekt existiert nicht mehr.

    Ich habe so geantwortet, dass es dem Niveau der Frage angemessen ist. Unter Standardannahmen stimmt das auch; bei Placement-new oder bei überladenem new etc. vielleicht nicht mehr, aber wer sowas einsetzen kann, muss nicht fragen, welche Objekte aus einem try-Block außerhalb noch leben.


Anmelden zum Antworten