Objekte Zerstörreihenfolge



  • int func () 
    {
        // Extrem böses Design:
        std::unique_ptr <T> (/*...*/);
        std::unique_ptr <L> (new L (T.get())); // Abhängigkeit
        std::unique_ptr <S> (new S (T.get(), L.get())); 
    
        /* ... */
    } // werden diese in gleicher Reihenfolge wieder zerstört?
    

    Ich hatte das Problem noch nicht, aber ich habe mich plötzlich gefragt, ob die Reihenfolge der Destruktoraufrüfe definiert ist / garantiert.
    Sieht auch für shared_ptr, bei komplexeren Zusammenhängen, nach extrem böser Fehlerfrickelei aus.



  • Objekte werden in umgekehrter Deklarationsreihenfolge wieder zerstört.



  • werden diese in gleicher Reihenfolge wieder zerstört?

    Nö. Das Objekt, das ganz oben auf dem Stack ist, wird zuerst gepopt und damit zerstört. Und dann das zweitoberste. Schlussendlich alle lokalen Variablen der Funktion (und dann die Funktionsparameter).
    Schlau oder? Damit bleiben bis zum Schluss alle Abhängigkeiten gültig.



  • DocShoe schrieb:

    Objekte werden in umgekehrter Deklarationsreihenfolge wieder zerstört.

    Definitionsreihenfolge.



  • klar schrieb:

    DocShoe schrieb:

    Objekte werden in umgekehrter Deklarationsreihenfolge wieder zerstört.

    Definitionsreihenfolge.

    In dem Fall hättest du aber noch mehr markieren müssen. 🤡 :xmas2:



  • Ups 🤡

    DocShoe schrieb:

    Objekte werden in umgekehrter Deklarationsreihenfolge wieder zerstört.

    Definitionsreihenfolge.



  • Ja, in umgekehrter Reihenfolge, meinte ich auch / hatte ich im Hinterkopf.


Anmelden zum Antworten