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 😉


Log in to reply