mit "delete" bekomme ich Fehler



  • Hi, also ich schreib grad so ein Programm wo eine Liste mit Daten entstehen soll.
    Eigentlich funktioniert auch alles soweit ( Liste erzeugen, in datei speichern , wieder laden usw. ), das Problem ist, das ich glaube was falsch gemacht zu haben.

    Man soll ja nachdem man Speicher mit "new" angefordert hat, auch wieder mit "delete" löschen. Genau das mach ich aber nicht, weil sonst das Prog abstürtzt.

    void Anhaengen(float anzahl, float platz, float prozent, string TName, string Datum)
    {
    	Eintrag *node = new Eintrag;	
            node->Anzahl_Spieler = anzahl;
    	node->Platz = platz;
    	node->Prozent = prozent;
    	node->T_Name = TName;
    	node->T_Datum = Datum;
    	node->next = first;
    	first = node;
    
    }
    

    mit dieser Funktion hänge ich weitere Daten an die Liste, nur wenn ich unten noch ein "delete node" hinschreibe, klappts nicht mehr.

    Ist es wicklich wichtig den Speicher hier wieder zu löschen ?
    Wie kann ich das machen ohne Fehler zu bekommen ?



  • toxor schrieb:

    Ist es wicklich wichtig den Speicher hier wieder zu löschen ?
    Wie kann ich das machen ohne Fehler zu bekommen ?

    Ohh ja, ist es.

    Nur musst du es richtig machen. 😉

    Ich glaube du hast da was grundsätzlich missverstanden..

    Du darfst das Objekt erst per delete freigeben, wenn du es nicht mehr brauchst. Wenn du es ja aber in deiner Liste haben willst und es dann löscht, dann wird es ja wieder freigegeben, obwohl er noch gebraucht wird.

    Also gehöt das delete dort hin, wo sinngemäs EntferndeObjekt hinkommt.



  • Ja genau das ist es ja, ich brauch die Daten noch. Aber wo soll ich die dann freigeben ? Ich brauch die ja solange das Programm läuft...oder organisier ich die Liste falsch ?



  • Du hast doch bestimmt irgend eine Funktion, wie Liste_Löschen oder so was.

    Ich würde dir sowieso empfehlen da eine Klasse draus zu machen. Da kannst du auch noch mit dem Destruktor arbeiten, wo die Liste nötigenfalls wieder freigegeben wird.
    Dann sollte man in einer Liste auch Einträge löschen können, dort wird dann auch wieder delete angewandt.

    Pseudocode

    {
        List l; //erzeuge Liste
    
        l.push (..); // neues Element (new)
        l.push (..); //neues Element (new)
        l.push (..); //neues Element (new)
        l.push (..); //neues Element (new)
    
        l.erease (..); lösche Element (delete)
    } //Gültigkeitsbereicht wird verlasssen also noch die restlichen einträge löschen
    // also noch 3 mal delete
    


  • Ah ok, also die Liste zu löschen habe ich noch gar nicht in Angriff genommen. Aber ich versteh ehrlich gesagt den Sinn trotzdem nicht ganz. Angenommen der User will nie löschen, dann würde delete ja nie aufgerufen. Der Speicher wird doch auch wieder gelöscht wenn das Programm beendet wird oder ? Übrigens, danke für die Infos drakon 🙂



  • Für normal wird da einfach in der Klasse im dtor geregelt, dass, wenn das Objekt (die Liste) gelöscht wird die Objekte, die noch da sind noch freigegeben werden.



  • toxor schrieb:

    Ah ok, also die Liste zu löschen habe ich noch gar nicht in Angriff genommen. Aber ich versteh ehrlich gesagt den Sinn trotzdem nicht ganz. Angenommen der User will nie löschen, dann würde delete ja nie aufgerufen. Der Speicher wird doch auch wieder gelöscht wenn das Programm beendet wird oder ? Übrigens, danke für die Infos drakon 🙂

    irgendwann beendet der benutzer doch das Programm, oder? dann sollte selbstverständlich zu diesem Zeitpunkt der Speicher wieder freigegeben werden. Zwar kümmert sich meistens das Betriebssystem selbst darum, aber darauf darf man sich nicht verlassen, auf nem anderen betriebssystem geht der speicher dann vielleicht bis zum nächsten neustart des Systems verloren 🙂


Log in to reply