Anfängerfrage, warum wird deconstructor so oft aufgerufen
-
...und auch ein
vector.push_back
kann je nachcapacity
undsize
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-Konstruktornoexcept
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 calledAlles nach -> habe ich eingefügt. Ich verstehe nicht was bei ? passiert
-
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*>.
-
&*
hebt sich gegenseitig auf, also istperson
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.