Braucht jede Klasse einen Destructer?



  • Redthoobe schrieb:

    Meine Frage: Braucht eigentlich jede Klasse einen Destructer? Ich rufe einige funktionen auf und als ich damals noch einen destructer hatte wure er auch mit aufgerufen was ich nicht mochte.
    Wisst ihr wie ich das verhindere das der Destructer mit aufgerufen wird?

    Jede Klasse hat automatisch einen Destruktor (EDIT: Ausser wenn sie eben keinen hat. Siehe dahier /EDIT). Wenn du keinen schreibst, dann erzeugt der Compiler einen für dich.
    Und er wird vom Compiler auch automatisch aufgerufen.

    Gegenfrage: Warum willst du dass der Destruktor nicht aufgerufen wird?

    Es gibt nämlich ganz sicher eine Lösung dafür was du versuchst zu machen, nur ist die ganz sicher nicht den Destruktor nicht aufzurufen. (Bzw. möglicherweise doch, aber nur wenn du gleich gar kein Objekt erzeugst.)



  • Torsten Robitzki schrieb:

    In Deinem Fall wird ein Destruktor aufgerufen, weil Du ein Objekt kopierst (getServer()). [...]

    Nope. Da wird dank RVO nix kopiert.


  • Mod

    hustbaer schrieb:

    Redthoobe schrieb:

    Meine Frage: Braucht eigentlich jede Klasse einen Destructer? Ich rufe einige funktionen auf und als ich damals noch einen destructer hatte wure er auch mit aufgerufen was ich nicht mochte.
    Wisst ihr wie ich das verhindere das der Destructer mit aufgerufen wird?

    Jede Klasse hat automatisch einen Destruktor. Wenn du keinen schreibst, dann erzeugt der Compiler einen für dich.

    Aber nur, wenn er auch gebraucht wird, um mal wieder zu den Spitzfindigkeiten zurück zu kehren 🙂 .



  • Swordfish schrieb:

    Torsten Robitzki schrieb:

    In Deinem Fall wird ein Destruktor aufgerufen, weil Du ein Objekt kopierst (getServer()). [...]

    Nope. Da wird dank RVO nix kopiert.

    Und war der Hinweis auf eine möglicherweise vom Compiler, optional durchgeführte Optimierung jetzt hilfreich für den OP? 😕



  • Der Punkt ist, daß wegen der (Nicht-)Kopie nix zerstört wird, aber am ende der main() totsicher.



  • Swordfish schrieb:

    totsicher

    SeppJ schrieb:

    zurück zu kehren

    Bitte etwas auf Rechtschreibung achten!



  • Torsten Robitzki schrieb:

    Und war der Hinweis auf eine möglicherweise vom Compiler, optional durchgeführte Optimierung jetzt hilfreich für den OP? 😕

    Wie ich anfangs schon erwähnt habe. Dieser Thread ist in eine Katastrophe ausgeartet mit jeder Menge (teilweise sogar auch falschen) Informatioen, die für den Fragesteller zum jetztigen Zeitpunkt (die Frage lässt auf einen Einsteiger schließen) absolut unnötiger Ballast sind. Das kommt einem hier ein wenig so vor also ob sich hier die ganzen Experten wie die Geier auf eine Anfängerfrage stürzen und alle zeigen wollen dass sie den längsten ...
    (... Absatz aus dem C++Standard auswendig aufsagen können)

    herb Sutter hat das mal (wenn auch in einem anderen Kontext) schön auf den Punkt gebracht:
    "It's hard to be remember that you are an expert."

    Es reicht erstmal wirklich aus zu wissen, dass man keinen Destruktor schreiben muss und dass das dann dasselbe ist als hätte man einen Destruktor mit leerem Funktionskörper geschrieben (tu (quasi) nix!).

    Finnegan



  • SeppJ schrieb:

    hustbaer schrieb:

    Redthoobe schrieb:

    Meine Frage: Braucht eigentlich jede Klasse einen Destructer? Ich rufe einige funktionen auf und als ich damals noch einen destructer hatte wure er auch mit aufgerufen was ich nicht mochte.
    Wisst ihr wie ich das verhindere das der Destructer mit aufgerufen wird?

    Jede Klasse hat automatisch einen Destruktor. Wenn du keinen schreibst, dann erzeugt der Compiler einen für dich.

    Aber nur, wenn er auch gebraucht wird, um mal wieder zu den Spitzfindigkeiten zurück zu kehren 🙂 .

    Hmmmmmmm *nachdenk*.
    OK, Mist!

    Also du meinst Klassen deren Dtor weder userdefiniert ist, noch irgendwo benötigt wird. OK, ja, die haben dann keinen. Und sie müssen nichtmal einen haben können wenn ich genauer drüber nachdenke. Sie könnten ja ne Basisklasse mit nem privaten Dtor haben -- dann würde der Compiler beim Versuch den impliziten Dtor zu generieren Zahnräder spucken.

    Oder hast du was anderes gemeint?


  • Mod

    hustbaer schrieb:

    Also du meinst Klassen deren Dtor weder userdefiniert ist, noch irgendwo benötigt wird. OK, ja, die haben dann keinen. Und sie müssen nichtmal einen haben können wenn ich genauer drüber nachdenke. Sie könnten ja ne Basisklasse mit nem privaten Dtor haben -- dann würde der Compiler beim Versuch den impliziten Dtor zu generieren Zahnräder spucken.

    Oder hast du was anderes gemeint?

    Genau die 2 Fälle meinte ich. Und noch den 2.5ten Fall, dass man den Destruktor explizit deleted.



  • Ach... scheiss drauf. Wenn der Thread eh schon im Arsch is 😃 ...

    SeppJ schrieb:

    Und noch den 2.5ten Fall, dass man den Destruktor explizit deleted.

    ... mach ich eigentlich immer so, seitdem hab ich kein Problem mehr mit Dangling Pointers! :p

    struct Dindong {
       ~Dindong () = delete;
    }
    

    ... habe sogar einen Smart Pointer dafür geschrieben, immortal_ptr , der in seinem Destruktor explizit kein delete macht, ist sicherer so, weil man es sonst vergisst und eventuell den Pointer deleted.
    Es gibt sogar eine Utility-Funktion make_immortal , die den Pointer auch dann nicht deleted, wenn eine Exception geworfen wird... sicher ist sicher 🤡

    Finnegan



  • Finnegan schrieb:

    SeppJ schrieb:

    Und noch den 2.5ten Fall, dass man den Destruktor explizit deleted.

    ... mach ich eigentlich immer so, seitdem hab ich kein Problem mehr mit Dangling Pointers! :p

    struct Dindong {
       ~Dindong () = delete;
    }
    

    Ich steh gerade auf dem Schlauch, in welchem Anwendungsfall sollte man einen DTOR deleten wollen?



  • Wüsste ich auch nicht, es sei denn man deleted den Default-Ctor gleich mit. Der Unterschied zu nem Namespace wäre dann immerhin noch dass man die Klasse z.B. als "Funktionssammlung" an ein Template übergeben könnte.

    Dass das ein Scherz von Finnegan war ist die aber klar, oder?



  • hustbaer schrieb:

    Dass das ein Scherz von Finnegan war ist die aber klar, oder?

    Hmpf, es sieht so aus als ob mein Ironie/Sarkasmus/Bullshit Detektor Anfragen erst ab 13.00 Uhr bearbeitet und auch nur dann, wenn der Koffeinspiegel ein akzeptables Niveau erreicht hat.

    Also Danke für den Hinweis. 🤡


Anmelden zum Antworten