Free und NULL Pointer.



  • Hallo Leute,

    ich habe eine blöde Frage ;).

    Wenn ich im Programm Speicher für eine Variable allokiere und den dann später frei gebe, soll ich mein Pointer auf NULL setzen oder macht es für mich free()?

    Hiwer ist ein Beispiel:

    char *pcVar = NULL;
    
    ...
    
    pcVar = strdup("Hallo");
    
    ...
    
    if (pcVar) {
    
      free (pcVar);
      pcVar = NULL;
    
    }
    
    ...
    

    Danke Euch!



  • wie sollte free() das tun? es bekommt doch keinen doppelpointer.
    🙂



  • free() macht das nicht, es kann es gar nicht können.



  • Tim schrieb:

    free() macht das nicht, es kann es gar nicht können.

    Also dann ist es ein MUSS?!



  • shuriko schrieb:

    Tim schrieb:

    free() macht das nicht, es kann es gar nicht können.

    Also dann ist es ein MUSS?!

    Was soll ein Muss sein? Den Pointer auf NULL zu setzen? Nein, das ist nicht notwendig, aber sicher keine schlechte Idee.



  • Hallo,

    müssen musst du überhaupt nichts, so lange du den Zeigerwert nicht mehr verwendest 😉 .

    MfG,

    Probe-Nutzer



  • Du musst aber auch nicht überprüfen ob der Zeiger NULL ist, da free selbst den Zeiger auf NULL prüft.

    Den Zeiger nach dem free auf NULL zu setzen lohnt sich nur, wenn du an anderen Stellen im Code überprüfen willst, ob der Zeiger noch gültig ist.



  • Du kannst dir ja eine eigene Funktion machen wenn du willst:

    void xfree(void** p)
    {
        free(*p);
        *p = 0;
    }
    

    Oder ein hübsches Makro:

    #define MY_SUPER_COOL_FREE(p) do { free((p)); (p) = 0; } while(0)
    

    Oder etwas in der Art...



  • was war nochmal der sinn dieses do...while(0). wusste ich mal, hab's aber vergessen. 🙂



  • #define MY_SUPER_COOL_FREE(p) do { free((p)); (p) = 0; } while(0)
    

    fehlt hier nicht ein ";"???

    das mit der while so das ganze nur in ein block fassen odeR?



  • Das Semikolon setzt man im Allgemeinen dort wo man das Makro aufruft. Und damit kommen wir auch schon zu dem Vorteil der do {} while Schreibweise: Es werden keine leeren Instruktionen erzeugt und der expandierte Ausdruck hat keinen Rückgabewert, so wie eine void-Funktion auch.



  • simmt:

    #define MY_SUPER_COOL_FREE(p) { free((p)); (p) = 0; }
    

    könnte man es nich einfach so machen mit klammerung?



  • LordJaxom schrieb:

    ...so wie eine void-Funktion auch.

    ach genau, das war der trick.
    🙂


Log in to reply