Frage zu: free(zeiger) / verkette Listen



  • Moin,

    ich hab mal eine kurz Frage zum freigeben von nicht mehr benoetigten Zeiger bzw. Inhalten. Ich hab ein Adressbuch mit einer einfach verketteten Liste geschrieben. Zum einfachen anhaengen, loeschen usw. habe mir 2 globale Zeiger deklariert. Der erste zeigt auf den Anfang der Liste und der zweite ist ein allgemeiner Zeiger z.b. wenn ich eine Person suche. Das was ich hier poste ist natuerlich nicht das ganze Programm sondern minimalistisch und beschraenkt sich auf das Wesentlich.
    Als Hinweis: Das Programm laeuft einwandfrei wobei ich es auch nie laenger als 5 Minuten durchprobiert habe (ich programmier nur aus Spass).

    struct person{
        vname[20];
        nname[20];
        *next;
    };
    struct person *anfang;
    struct person *zeiger;
    

    Nun zu meiner Frage:
    Wenn ich eine Person loeschen will, dann mach ich das folgende:

    if(0 == strcmp(zeiger->vorname, vname) && 0 == strcmp(zeiger->nachname, nname)){                 // richtige Person in "zeiger" gefunden -> zeiger soll geloscht werden
        zeigertmp->next = zeiger->next;        // zeigertmp nur in dieser Funktion (nicht global) vorhanden, zeigt in der Liste auf eine Person vor zeiger 
                                               // zeiger jetzt nicht mehr in der Liste
        free(zeiger);                          // zeiger wird geloescht :warning: auf diese Zeile kommt es an.
    }
    

    1. Wenn ich jetzt die Zeile "free(zeiger);" weglassen wuerde. Kommt es dann auf Dauer zu Speicherleaks weil die Personen ja nicht geloescht werden?
    2. Geb ich den globalen Zeiger frei? --> Kann es also sein dass die Adresse vom zeiger irgendwann etwas anderem zugeordnet wird und alles drunter und drueber geht?



  • DerMaddi schrieb:

    1. Wenn ich jetzt die Zeile "free(zeiger);" weglassen wuerde. Kommt es dann auf Dauer zu Speicherleaks weil die Personen ja nicht geloescht werden?

    Ja. Da du ja keinen Zugriff mehr auf diesen Speicherbereich hast. Du kommst über deine Liste ja nicht mehr an den Zeiger ran.

    DerMaddi schrieb:

    2. Geb ich den globalen Zeiger frei?

    Wenn du in deiner Freigabefunktion den globalen zeiger benutzt ja.

    DerMaddi schrieb:

    --> Kann es also sein dass die Adresse vom zeiger irgendwann etwas anderem zugeordnet wird und alles drunter und drueber geht?

    Ja, die Adresse auf die zeiger noch zeigt kann dann eetwas anderes enthalten.

    Aber du kannst zeiger ja auch etwas zuweisen:

    ...
        free(zeiger);   
        zeiger = NULL;      // Dann weißt du das  der Bereich üngültig ist
    // oder
        zeiger = zeigertmp; // zeigt noch auf einen sinnvollen Bereich
      }
    


  • Meine Frage ist etwas wirr formuliert gewesen aber danke fuer die Antworten.

    Eine Sache habe ich aber nicht so ganz verstanden:
    Wenn ich einen Zeiger mit free(); freigebe, gebe ich dann sozusagen den Zeiger an sich frei, oder nur das worauf er momentan zeigt?
    Kann man einen Zeiger denn weiterbenutzen nachdem man ihn mit free(); freigegeben hat?
    Weil du hast ja den globalen Zeiger freigegeben und danach NULL zugewiesen.

    ...
        free(zeiger);   
        zeiger = NULL;      // Dann weißt du das  der Bereich üngültig ist
    // oder
        zeiger = zeigertmp; // zeigt noch auf einen sinnvollen Bereich
      }
    

    Eigentlich moechte ich ja nicht den globalen Zeiger freigeben sondern nur den Inhalt loeschen auf den der Zeiger grade zeigt...



  • DerMaddi schrieb:

    Eigentlich moechte ich ja nicht den globalen Zeiger freigeben sondern nur den Inhalt loeschen auf den der Zeiger grade zeigt...

    Der globale Zeiger bleibt dir weiterhin erhalten.
    Du gibst nur den Speicherbereich frei, auf den zeiger zeigt. (nix mit löschen, die Daten stehen da noch drin)

    zeiger zeigt dann auch weiterhin auf den Bereich. Nur darfst du den Bereich nicht mehr benutzen.

    Darum machst du zeiger = NULL; und weisst dann, das zeiger ungültig ist.



  • Genau das wollte ich wissen
    Danke fuer die Antwort : )


Anmelden zum Antworten