Ich drücke die Objektklasse tipo auf einen Vektor, wenn ich den ersten drücke, wird der Konstruktor aufgerufen (wie es sollte) und der Destruktor wird sofort aufgerufen (was meiner Meinung nach nicht passieren sollte). Wenn ich dann das nächste Objekt pushe, wird der Konstruktor einmal und der Destruktor zweimal aufgerufen, dann beim dritten dreimal und so weiter.
Es scheint, dass der Destruktor jedes Mal öfter aufgerufen wird, wenn ich etwas auf den Vektor schiebe.
Das ist meine Klasse:
class Item
{
protected:
...
public:
Item();
Item(char * no, int hit, int ve, char * pathTilesheet, int an, int al, bool inv, bool vol, bool fan, int mh = NULL);
~Item();
};
Item::Item(char *no, int hi, int ve, char *pathTilesheet, int an, int al, bool inv, bool vol, bool fan, int mh){
// CARGAR SDL
tileSheet = load_image(pathTilesheet);
tileSheetEspejo = flip_surface(tileSheet, FLIP_HORIZONTAL);
}
Folgendes passiert:
std::vector<Item> vecItems;
vecItems.push_back(Item("life",4,0,"assets/imagenes/hp.png", 8, 8, false, false, false));
// HERE THE CONSTRUCTOR AND THE DESTRUCTOR ARE CALLED
vecItems.push_back(Item("lifeXL",8,0,"assets/imagenes/hp-xl.png", 16, 16, false, false, false));
// HERE THE CONSTRUCTOR IS CALLED ONCE AND THE DESTRUCTOR TWICE
vecItems.push_back(Item("blast 1",-4,14,"assets/imagenes/bola.png", 8, 8, false, true, false));
// HERE THE CONSTRUCTOR IS CALLED ONCE AND THE DESTRUCTOR MULTIPLE TIMES
Mache ich etwas falsch? Warum könnte das passieren?
Es liegt wahrscheinlich an Kopien und Umverteilungen. Vector verwendet kontinuierlichen Speicher. Wenn Sie also seine Kapazität überschreiten, muss es einen größeren Teil des Speichers zuweisen, alle vorhandenen Elemente kopieren und dann den vorherigen Speicher freigeben.
– Benutzer2802841
10. November 2013 um 15:35 Uhr
Diese Frage könnte Sie interessieren: stackoverflow.com/q/13395984/1741542
– Olaf Dietsche
10. November 2013 um 15:36 Uhr
Um zu sehen, ob @user2802841 richtig ist, könnten Sie versuchen, vecItems.reserve(3) einzufügen; vor deinen Aussagen.
– bennofs
10. November 2013 um 15:36 Uhr
Zählen Sie die Aufrufe des Kopierkonstruktors, um zu sehen, ob das Gleichgewicht stimmt …
– Stefan Haustein
10. November 2013 um 15:37 Uhr
Wenn Sie einen Destruktor schreiben, müssen Sie sich wahrscheinlich um Kopieren und Zuweisung kümmern. Google “Dreierregel c++”.
– Yakk – Adam Nevraumont
10. November 2013 um 15:41 Uhr