Destruktor im Konstruktor ??



  • Aha. Also danke erstmal für die anschaulichen Beispiele, ich hab das soweit verstanden und werde das in Zukunft so oder so ähnlich umsetzen.

    Fragt sich natürlich, warum Du den Zeiger überhaupt benötigst.

    von cpp_tutor.de oder so :

    Soll ein Objekt innerhalb eines try-Blocks erstellt und danach auch außerhalb des Blocks zur Verfügung stehen, so muss ein entsprechender Objektzeiger, der natürlich außerhalb des try-Blocks definiert wird, eingesetzt werden. Vergessen Sie dabei aber nicht, dass im Fehlerfall das Objekt eventuell nicht gültig ist

    [quote]

    =>Wollte das in die Richtung umsetzten, hab aber dabei schon gemerkt das es käse ist, da auch wenn kein Fehler vorliegt, der Destruktor beim Verlassen des Try Blocks durchläuft.

    Würde es etwas ändern irgendwie mit new zu arbeiten, oder ist hier wirklich uniuque_ptr die Lösung ? (also für "Im Block erstellen", aúßerhalb damit arbeiten... oder geht es hald einfach gar nicht...)



  • unique_ptr ist hier die beste Lösung, raw pointer mit new geht auch, ist allerdings nie so gut wie ein smart pointer. Die Gründe kann man in jedem C++-Forenbeitrag nachlesen, in dem jemand new ohne smart pointer nutzt.



  • raw pointer mit new geht auch

    Kann das bitte jmd. zeigen? Also wie man mit new (obwohl man nicht machen soll) das ganze löst?

    Ich habe in der Regel ein try-catch in meiner main und sonst im Code eher selten.

    Quasi so :??:

    int main(){
    
    try{
       mein_code() // also so ähnlich wie bei happystudent, in mein_code wird =>ALLES<= verwaltet??
    }catch(//wie auch immer...){
      //sth. else...
    }
    
    }
    


  • Gutes Exception Handling funktioniert quasi komplett ohne try/catch.

    Also ein paar try/catch sind notwendig, aber sehr sehr sehr sehr sehr sehr sehr sehr sehr wenige.

    Siehe:
    http://magazin.c-plusplus.net/artikel/Exception-Handling
    http://magazin.c-plusplus.net/artikel/Modernes Exception-Handling Teil 1 - Die Grundlagen
    http://magazin.c-plusplus.net/artikel/Modernes Exception-Handling Teil 2 - Hinter den Kulissen



  • Shade Of Mine schrieb:

    Also ein paar try/catch sind notwendig, aber sehr sehr sehr sehr sehr sehr sehr sehr sehr wenige.

    Ich finde, das sollte man nicht so pauschalisieren.


  • Mod

    happystudent schrieb:

    beg_offl schrieb:

    Macht man das wirklich so? Ich hab noch nicht soviel mit Try und Catch gemacht, aber wird das dann nicht irgendwann uferlos?

    Du meinst uferlos weil du dann überall wo du ein solches Objekt erstellst einen try-catch block schreiben musst?

    Also ich mach das immer ungefähr so:

    #include <iostream>
    
    int my_main() {
        // Hier die "echte" main in der alles gemacht wird
    }
    
    int main() {
        // Hier wird nur "my_main" aufgerufen
        try {
            return my_main();
        }
        catch (std::exception const &ex) {
            std::cerr << ex.what() << '\n';
        }
    }
    

    Dann kannst du dir sicher sein dass du eine Fehlermeldung bekommst wenn eine exception geworfen wird und du musst den try-catch block nur einmal schreiben. Natürlich kannst du lokal in my_main (oder von diesem aufgerufenen Unterfunktionen) noch weitere try-catch Blöcke einfügen um diese gegebenenfalls anders zu behandeln.

    Auf welcher (hosted) Implementierung arbeitest du denn, die dir keine Rückmeldung über ungefangene Exceptions beim Abbruch gibt? Und selbst wenn du paranoiderweise annimmst, dass deine Umgebung nicht das tut, was du hier von Hand versuchst, wäre es wohl immer noch deutlich übersichtlicher, einen entsprechenden terminate-Handler zu setzen. Und noch einen unexcepted-Handler für die paranoid²-Absicherung.



  • Also so nicht machen. Verstanden...
    SeppJ, nicht falsch verstehen, aber wie würdest du es generell machen, als "Großmeister" ?


  • Mod

    beg_off schrieb:

    SeppJ, nicht falsch verstehen, aber wie würdest du es generell machen, als "Großmeister" ?

    Siehe Shade of Mines Beiträge.



  • Oh, Sorry übersehen. Das zieh ich mir mal rein.

    evtl. noch was zu

    raw pointer mit new geht auch

    Kann das bitte jmd. zeigen? Also wie man mit new (obwohl man nicht machen soll) das ganze löst?

    ???



  • Hast du das etwa auch übersehen?

    Hi schrieb:

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

    Mit nem rohen Zeiger geht es genauso.



  • Nö, aber falsch verstanden.
    Besten Dank an alle!



  • 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"?


Anmelden zum Antworten