Objekte werden gelöscht



  • Hi warum werden die Objekte pro Schleifendurchlauf wieder gelöscht, bzw. wie bleiben sie erhalten?

    	for (int i = 0; i < 2; i++) {
    		cout << "Name fuer Spieler " << i+1 << endl;
    		cin >> name;
                spielerliste[i] = player(name);
        		}	  	
    


  • Es wird nichts gelöscht, aber du überschreibst in jedem Schleifendurchlauf den Inhalt von name.



  • Wenn ich das mache ist segmentation fault

    int main () {
    	
    	vector<player>*spielerliste[2];
    	string name;
    	
    	for (int i = 0; i < 2; i++) {
    		cout << "Name fuer Spieler " << i+1 << endl;
    		cin >> name;
                (*spielerliste)->push_back(player(name));
        		}	  		
    	system ("pause");
    }
    

    Wenn ich das mache kommt terminating with uncaught exception of type std::length error

    int main () {
    	
    	vector<player>*spielerliste;
    	string name;
    	
    	for (int i = 0; i < 2; i++) {
    		cout << "Name fuer Spieler " << i+1 << endl;
    		cin >> name;
                spielerliste->push_back(player(name));
        		}	  		
    	system ("pause");
    }
    

    Würde mich sehr über einen Weg freuen der funktioniert )



  • @ycbm sagte in Objekte werden gelöscht:

    Wenn ich das mache ist segmentation fault

    Dann mach das doch nicht.

    int main () {
    	
    	vector<player>*spielerliste[2];
    

    Wo hast du das denn her? Weißt du überhaupt, was das bedeutet?



  • @ycbm Wenn man nicht initialisierte Zeiger benutzt, passiert das halt.



  • Woher ich das habe..naja wildem rumprobieren, wenn's dann zufällig klappt kann ich die Logik rekonstruieren )

    mit

    int main () {
    	vector<player>spielliste;
    	vector<player>*spielerliste = &spielliste;
    	string name;
    	
    	for (int i = 0; i < 2; i++) {
    		cout << "Name fuer Spieler " << i+1 << endl;
    		cin >> name;
                spielerliste->push_back(player(name));
        		}	  		
    	system ("pause");
    }
    

    kommen zwar keine Fehler mehr aber die Objekte werden pro Schleife immernoch gelöscht, sogar alle die ich vorher mit

    	vector<player>spielliste(2);
    

    reinmache..



  • Wir kennen die Klasse "player" nicht. Insofern kann man wenig sagen, wer oder was wo gelöscht wird (und von welchen Objekten sprichst du? Den player-Objekten?).

    Ich rate mal, dass du mit "Löschen" player::~player()-calls meinst:

    Ein Objekt in einem vector kann gelöscht werden, wenn zum Beispiel der Vector vergrößert werden muss. Dann werden die Objekte im Vector umkopiert vom alten Speicherbereich in einen neuen, größeren kopiert und danach werden die alten Objekte gelöscht.

    Mit player(name) erzeugst du ein temporäres player-Objekt, das dann mit push_back in den vector kopiert wird. Danach wird das temporäre Objekt gelöscht.

    PS: ich ignoriere hier einfach mal den Unterschied Kopie/Move



  • @ycbm sagte in Objekte werden gelöscht:

    Woher ich das habe..naja wildem rumprobieren, wenn's dann zufällig klappt kann ich die Logik rekonstruieren )

    Und woher weißt du, ob es "klappt"? Hast du schonmal von undefiniertem Verhalten gehört?

    Ich dachte du willst jetzt irgendwie auf dem schnellsten Wege C++ lernen, um dich selbständig zu machen. So ist das aber eher der langsamste Weg. Wieviele Jahre gibst du dir?

    int main () {
    	vector<player>spielliste;
    	vector<player>*spielerliste = &spielliste;
    	string name;
    	
    	for (int i = 0; i < 2; i++) {
    		cout << "Name fuer Spieler " << i+1 << endl;
    		cin >> name;
                spielerliste->push_back(player(name));
        		}	  		
    	system ("pause");
    }
    

    kommen zwar keine Fehler mehr aber die Objekte werden pro Schleife immernoch gelöscht

    Kann schon sein, dass da Objekte gelöscht werden, aber werden auch die Objekte gelöscht? Welche sind das? Poste mal ein vollständiges Programm. Ohne eine Definition von player kann man hier sowieso nichts sagen. Woher weißt du überhaupt, was da gelöscht wird, hast du eine Ausgabe im Destruktor?



  • @ycbm sagte in Objekte werden gelöscht:

    Wenn ich das mache ist segmentation fault

    int main () {
    	
    	vector<player>*spielerliste[2];
    	string name;
    	
    	for (int i = 0; i < 2; i++) {
    		cout << "Name fuer Spieler " << i+1 << endl;
    		cin >> name;
                (*spielerliste)->push_back(player(name));
        		}	  		
    	system ("pause");
    }
    

    Wenn ich das mache kommt terminating with uncaught exception of type std::length error

    int main () {
    	
    	vector<player>*spielerliste;
    	string name;
    	
    	for (int i = 0; i < 2; i++) {
    		cout << "Name fuer Spieler " << i+1 << endl;
    		cin >> name;
                spielerliste->push_back(player(name));
        		}	  		
    	system ("pause");
    }
    

    Würde mich sehr über einen Weg freuen der funktioniert )

    Warum ein Pointer auf den Vector? (das ist mir beim letzten Mal gar nicht aufgefallen)

    Versuch doch mal:

    vector<player> spielerliste;
    //.... 
    spielerliste.push_back(player(name));
    

    Und, mich würde tatsächlich jetzt auch interessieren, was du unter löschen verstehst?



  • OK, da zwei Objekte nach pause zerstört werden ist es wohl der Beweis, dass es sie doch gibt aber warum sind sie jetzt namenlos?

    #include <iostream>
    #include <string>
    #include <vector>
    
    
    using namespace std;
    
    class player {
    	
    	public:
    	
    	string name;
    	static int spielerid;
    	int id;
    	
    	player () {
    		spielerid++;
    		id = spielerid;
    		cout << "Spieler wurde erstellt" << endl << endl;
    	}
    	
    	player (string name)
    	: name (name) {
    		spielerid++;
    		id = spielerid;
    		cout << "Spieler " << name << " wurde erstellt" << endl << endl;
    	}
    	
    	player (const player& rhs) {
    		cout << "Kopierkonstruktor aufgerufen" << endl;}
    	
    	~player () {
    		cout << "Spieler " << name << " wurde vernichtet" << endl << endl;
    	}
    				
    	private:		
    };
    
    class field {
    	
    	public:
    	
    };
    
    int player::spielerid = 0;
    
    int main () {
    	vector<player>spielliste;
    	vector<player>*spielerliste = &spielliste;
    	string name;
    	
    	for (int i = 0; i < 2; i++) {
    		cout << "Name fuer Spieler " << i+1 << endl;
    		cin >> name;
                spielerliste->push_back(player(name));
        		}	 
        		cout << "Ausgabe: " << spielliste[0].name.c_str() << endl;
        		cout << "Ausgabe: " << spielliste[1].name.c_str() << endl;
        system ("pause");
    }
    


  • Dein Kopierkonstruktor kopiert nichts.



  • Ok Fehler gefunden aber verstehen tu ich's nicht..wär echt cool für ne Erklärung. Wenn ich den Kopierkonstruktor rausnehme funktioniert's..



  • @ycbm wenn du den Kopierkonstruktor raus nimmst, erstellt der Compiler einen (Google mal nach Rule of 0/3/5). Wenn du selbst einen schreibst, muss der auch kopieren.



  • I will danke



  • Kurze Fragen:
    Eine Flache Kopie, ist eine Kopie, die gemacht wurde, ohne einen copyconstructor zu programmieren. Alle Variablen der Kopie zeigen auf die Adresse des Originals? Oder ist das nur bei Zeigern der Fall?

    Tiefe Kopie wird selbstständig programmiert um neue Speicher zuzuweisen? Geht das dort nur mit new?



  • flache kopie bedeutet eigentlich, dass du nur eine referenz auf das ursprüngliche objekt erhälst, und tiefe kopie bedeutet, dass ein neues objekt mit gleichem inhalt erstellt wird.


  • Mod

    @Wade1234 sagte in Objekte werden gelöscht:

    flache kopie bedeutet eigentlich, dass du nur eine referenz auf das ursprüngliche objekt erhälst, und tiefe kopie bedeutet, dass ein neues objekt mit gleichem inhalt erstellt wird.

    Nein.



  • @ycbm sagte in Objekte werden gelöscht:

    Kurze Fragen:
    Eine Flache Kopie, ist eine Kopie, die gemacht wurde, ohne einen copyconstructor zu programmieren. Alle Variablen der Kopie zeigen auf die Adresse des Originals? Oder ist das nur bei Zeigern der Fall?

    Nur bei Zeigern. Da wird dann halt der Zeiger kopiert. Hinterher zeigen beide auf das gleiche Objekt.

    Tiefe Kopie wird selbstständig programmiert um neue Speicher zuzuweisen? Geht das dort nur mit new?

    Der erstellte Konstruktor kopiert alle Member richtig. Nur wenn du Pointer Member hast, wird halt der Pointer kopiert, wenn das zugrunde liegenden Objekt kopiert werden soll, muss man das selbst machen (das ist dann aber meistens der Fall).
    new brauchst du dafür nicht. Für Anfänger (und auch Fortgeschrittenen) gilt eigentlich, dass man new nie braucht. Die Verwendung von new ist eine absolute Ausnahme.



  • Weshalb stellt sich jeder so arg gegen new/delete? Es erscheint so nativ und handlich.



  • @ycbm weil auch Profis damit sehr schnell Fehler machen. Außerdem gibt es genug Klassen die Ressourcen Verwaltung bereit stellen und weg kapseln die durch getestet sind und korrekt arbeiten. Das kann man selbst nur schlechter machen.


Anmelden zum Antworten