Anfängerfrage, warum wird deconstructor so oft aufgerufen



  • ...und auch ein vector.push_back kann je nach capacity und size dafür sorgen, dass die bislang existierenden Objekte in neuen Speicherbereich umkopiert werden müssen - nämlich wenn die neue Größe zu groß wird (es werden deine Objekte auch gemovet, wenn dein Move-Konstruktor noexcept ist) Dadurch kannst du also auch einen Destruktorcall bekommen.



  • Danke euch beiden für die Antworten. Dann werde ich einmal versuchen den Kopierkonstruktor mit einer Ausgabe zu implementieren und führe den Test nochmals durch. Danke auch für die Info, dass die Vector-Klasse "selbständig" unter gewissen Bedingungen einen Move/Copy durchführt 🙂



  • Deconstructor

    Es heisst zwar "Destruktor", aber "Dekonstruktor" trifft es eigentlich auch ziemlich gut. Schliesslich sollten kompexere Objekte nicht einfach gespengt, sondern fein säuberlich demontiert werden 🙂





  • Ich habe jetzt noch den Kopierkonstruktor mit einer Ausgabe der Klasse Person hinzugefügt. Hier der Output:

    constructor of John called -> wegen Person John{}
    Copy constructor of John called -> wegen StackTresor.storePerson(John)
    Copy constructor of John called -> wegen vector.push-back(John)
    virtual deconstructor of John called -> ?
    Copy constructor of John called -> ?
    virtual deconstructor of John called
    virtual deconstructor of John called
    virtual deconstructor of John called

    Alles nach -> habe ich eingefügt. Ich verstehe nicht was bei ? passiert 😞


  • Mod

    Du hast deinen Beitrag zwar gelöscht, aber ich kann die Frage vielleicht trotzdem für andere Leser beantworten:

    void Tresor::storePerson(Person person)
    {
        myPersons.push_back(person);
    }
    

    Das person in dieser Funktion ist ebenfalls eine Kopie und dieses Objekt wird beim Verlassen der Funktion zerstört. Das soll dein Programm ja vermutlich auch zeigen, da das bei storePersonBySingleRef nicht passiert.



  • @SeppJ Danke dir, macht Sinn 😀



  • Ich habe noch eine Anschlussfrage:

       //Create Persons on the Heap
        auto Rambo = new Person("Rambo", 44);
        //auto McClain = new Person("McClain", 39);
        auto Connor = new Person("Connor", 23);
    
        //Create a Tresor-Obj on Stack
        Tresor StackTresor{};
    
        StackTresor.storePerson(Rambo); //Person*
        StackTresor.storePersonByCopyByReference(Connor); //Connor*
    

    und hier die Methodenimplementation:

    void Tresor::storePerson(Person *person)
    {
        myPersonsPtr.push_back(person);
    }
    
    void Tresor::storePersonByCopyByReference(Person *person)
    {
        myPersonsPtr.push_back(&*person);
    }
    

    Frage: Ist es richtig, dass beide Methoden genau das gleich machen. Nämlich sie speichern einen Pointer zu einem Person-Obj in einem Vector<Person*>.


  • Mod

    &* hebt sich gegenseitig auf, also ist person dasselbe wie &*person.

    (Da sind übrigens nirgends Kopien oder Referenzen in deinem storePersonByCopyByReference)



  • @SeppJ Super, danke dir :). Ja, meine Methodennamen sind komplett irreführend und falsch, da hast du recht.


Anmelden zum Antworten