Es geht um folgendes einfaches Beispiel:
Code: Alles auswählen
#include <iostream>
#include <vector>
using namespace std;
class ding {
private:
public:
ding() {
cout << "Ding erstellt!" << endl;
}
~ding() {
cout << "Ding geloescht!" << endl;
}
};
void f() {
vector<ding> haufen;
ding objekt;
haufen.push_back(objekt);
haufen.push_back(objekt);
haufen.push_back(objekt);
return;
}
int main(int argc, char** Argv) {
f();
return 0;
}
Soweit so einfach. Nach meiner Überlegung müssten jetzt vier Instanzen der Klasse ding erzeugt worden sein und demnach im Speicher liegen. Nämlich die lokal angelegte Instanz "objekt" und weitere drei Instanzen im vector haufen.
Und wenn nun die Funktion f() wieder verlassen wird, müssten doch auch eigentlich vier Instanzen von der Klasse "ding" gelöscht werden.
Als output bekomme ich aber folgendes angezeigt:
Ding erstellt!
Ding geloescht!
Ding geloescht!
Ding geloescht!
Ding geloescht!
Ding geloescht!
Ding geloescht!
Ding geloescht!
Und wenn ich statt drei nur zwei dinge mittels push_back() in den haufen schiebe:
Ding erstellt!
Ding geloescht!
Ding geloescht!
Ding geloescht!
Ding geloescht!
Müsste nicht schon alleine der Umstand super problematisch sein, dass nur eine Instanz erzeugt und ganze sieben (Beispiel eins) gelöscht werden?
Man stelle sich vor ich lösche über den Destruktor ein Element im Heap, dass ich zuvor über den Konstruktor erstellt hätte.
Code: Alles auswählen
Character* Kreatur; // Zeiger auf ein Character-Objekt im Heap
...
delete Kreatur;
Kann mir jemand erklären, was hier passiert und ob das ganze mit rechten Dingen zu- und hergeht?
Edit:
Kann es vielleicht sein, dass anstelle des "normalen" Konstruktor eine Art unsichtbarer Kopier-Konstruktor aufgerufen wird und ich deshalb nicht geloggt bekomme, dass tatsächlich in der Summe gleich viele Ding-Instanzen erstellt, wie gelöscht werden?
Gruss starcow