[Solved]Mehrfacher Destruktoraufruf für dasselbe Objekt?



  • Guten Abend.

    Bei einem kleinen Testprogramm das ich geschrieben
    habe, stoße ich gerade auf ein unerklärliches Phänomen.
    Erstmal der simple Code:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class Test {
    
            public:
            Test(int number=0) : number(number) {
                    cout << "\tKonstruktor " << number << endl;
            }
    
            ~Test() {
                    cout << "\tDestruktor " << number << endl;
            }
    
            private:
            int number;
    
    };
    
    int main() {
    
            vector<Test> container;
    
            cout << "Fülle Container" << endl;
            for(int i=0; i < 3; i++) {
                    container.push_back(Test(i));
                    cout << endl;
            }
    
            cout << "Container voll" << endl;
    
            return 0;
    
    }
    

    Und nun die Ausgabe die mich so verwirrt
    (compiliert ohne Optimierung mit dem g++-4.1)

    Fülle Container
            Konstruktor 0
            Destruktor 0
    
            Konstruktor 1
            Destruktor 0
            Destruktor 1
    
            Konstruktor 2
            Destruktor 0
            Destruktor 1
            Destruktor 2
    
    Container voll
            Destruktor 0
            Destruktor 1
            Destruktor 2
    

    Wie man deutlich sieht werden bei jedem neuen Objekt
    im vector die bereits vorhandenen zerstört.
    (was mich bei push_back auch nicht wundern würde,
    wenn auch wieder der Konstruktor aufgerufen wird)

    Im Endeffekt wird also das Objekt Nummer 0, 4 mal zerstört!

    Kann jemand das bei einem anderen Compiler nachvollziehen?
    Ist dieses Verhalten irgendwie erklärbar?
    Ist es gar standardkonform?



  • Beim push_back werden Kopien erzeugt, du loggst aber den Kopierkonstruktor nicht mit. Klar, dass das dann komisch aussieht.



  • Ohhh 🙄
    Und ich zermahl mir hier das Hirn was da vor sich geht.

    Man manchmal hat man einfach ein Brett vor dem Kopf.

    Danke 👍


Anmelden zum Antworten