Was passiert da genau (vector)?
Verfasst: 26.12.2019, 12:07
Ich stehe einmal mehr vor einem Verständnisproblem und finde darauf irgendwie keine schlüssige Antwort.
Es geht um folgendes einfaches Beispiel:
Ich lege einen vector "haufen" an und befülle ihn mit Instanzen der Klasse "ding".
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.
Das müsste doch einen schweren Fehler verursachen, da ein Element versucht wird mehrere male zu löschen.
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
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