Pointer löschen oder nicht ?!
-
Ich möchte einen Fussball manager schreiben und habe dafür eine readin funktion, die daten aus einer txt.datei einließt. Die Datei sieht ungefähr so aus:
Liga: 1.Bundesliga Verein: Hamburger SV Rene Adler 12 Rafael vanderVaart 7 Verein: Eintracht Braunschweig Soeren Grahns 2 Karim Bellarabi 10
und meine Readinfunction so :
#include "ReadIn.h" #include "Player.h" #include <deque> #include <fstream> #include <string> #include <sstream> #include <memory> #include <iostream> std::string zeile,word1, word2, sname, lname; std::deque<Team*> Teamvector; int str, a = 0, b = 0 , c = 0; void readin_fillVector(std::deque<Team> &v, std::deque<League> & w, std::vector<Player> u) { ifstream fin("C:\\Users\\david\\Documents\\Visual Studio 2013\\Projects\\Anstoss2014\\Datenbank\\test.txt"); //Einlesen der Zeilen starten while (getline(fin, zeile)) { fin >> word1; //find out if this line contains the team name or the players if (word1 == "Liga:"){ getline(fin, word2); //deleting the empty space in front of the team name word2.erase(0, 1); w.push_back(League(word2, c)); c++; } else if (word1 == "Verein:"){ getline(fin, word2); //deleting the empty space in front of the team name word2.erase(0, 1); v.push_back(Team(word2, a)); //League gets the new member ( the team which was read in the line before) w.back().AddTeam(&v.back()); //Team gets an pointer to the league it plays in v.back().SetLeague(&w.back()); a++; } else{ fin >> lname >> str; Player* player = new Player(); player->setinformation_(b, word1, lname, str, &v.back()); u.push_back(*player); v.back().AddPlayer(player); b++; } } }
Die Frage ist nun:
Eigentlich muss ich wegen dem new() den erstellten Pointer auf die Spieler klasse ja löschen.
Aber tue ich dass, sind beim Auslesen alle Informationen über den Spieler, der im Teamvektor des Teams gespeichert ist, verloren.
Wie ich kann ich das umgehen ?Und macht das Design so grundsätzlich überhaupt Sinn ?
Es funktioniert jedenfalls so wie es soll bisher, nur dass eben die Pointer nicht gelöscht werden.
-
Du solltest an geeigneter Stelle den Speicher wieder freigeben, nämlich wenn die Zeiger aus dem vector verschwinden. Normalerweise umgeht man das, indem man einfach statt Player * direkt Player speichert, dann hat man kein new und braucht kein delete. Wenn es dann unbedingt sein muss, dann nimmt man unique_ptr, der ruft automatisch delete auf wenn er verschwindet:
void readin_fillVector(std::vector<std::unique_ptr<Player>> u){ auto player = std::make_unique<Player>(); player->setinformation_(b, word1, lname, str, &v.back()); u.push_back(std::move(player)); }
-
jimbo999 schrieb:
Eigentlich muss ich wegen dem new() den erstellten Pointer auf die Spieler klasse ja löschen.
Aber tue ich dass, sind beim Auslesen alle Informationen über den Spieler, der im Teamvektor des Teams gespeichert ist, verloren.
Wie ich kann ich das umgehen ?Du löschst ihn dann, wenn er nicht mehr gebraucht wird, und nicht schon vorher.
Das müsste vermutlich im Destruktor von Team sein.
Kleine Anmerkung: Dein Sprachgebrauch deckt hier vermutlich deinen Denkfehler auf. Es werden nämlich keine Pointer gelöscht, der Pointer ist danach immer noch gesund und munter. Das was gelöscht wird ist das Objekt, auf das der Pointer zeigt.
-
Danke sehr, überlege mir das nun alles zu umgehen und alles über die TeamIDs und PlayerIDs zu machen, die ja auch einen direkten Zugang der einzelnen Klassen zueiander ermöglichen. Die pointer verwirren mich nur zu sehr