Pointerinitialisierung nach free()



  • Mahlzeit,

    ich hab gerade irgendwie ein Problem beim Verständnis damit, was nach einem free-Aufruf alles passiert, bzw. was noch manuell getan werden sollte. Folgende Ausgangssituation:

    char* ptr = NULL;
    if( ( ptr = malloc( 256 ) ) != NULL ) {
       /* Mache was mit dem Speicher */
    }
    
    else {
       fprintf( stderr, "Hups, da lief was falsch!" );
       free( ptr );
       ptr = NULL;
       return -1; /* irgendein Wert an aufrufende Stelle zum Abfragen halt */
    }
    
    /* [...] */
    free( ptr );
    ptr = NULL;
    

    1.) Ist es notwendig den Pointer ptr, der nach dem free-Aufruf ja theoretisch immer noch auf den Anfang des Speicherbereichs zeigt, auf NULL (oder was sinnvolleres?) zu biegen? Der Speicherbereich ist ja eigentlich nicht mehr gültig; würde bedeutet, ptr besitzt keine gültige Initialisierung, oder?

    2.) Angenommen die Allokation schlug fehl, ist es möglich, dass teilweise Speicherbereich reserviert wurde? Weil das würde ja bedeuten, man muss den free()-Aufruf im else definitiv aufrufen. Oder reicht die Fehlerausgabe und die beispielhafte Rückkehr an die aufrufende Stelle?

    Hoffe die Fragen sind verständlich 🙂

    Vielen Dank im Voraus!



  • 1.) nö is nicht nötig, kannste natürlich der übersichtlichkeit halber machen, falls du den ptr später nochmal verwenden willst und sicherstellen willst, daß er immer sachgemäß initialisiert ist.
    2.) nein. du musst free() nicht aufrufen, schließlich ist ptr NULL.



  • 1.) notwendig nein, sinnvoll kann es u.U. schon sein

    2.) Kein free() ausführen wenn malloc() NULL lieferte. Es würde aber nichts passieren, da free() bei NULL als Argument einfach nichts macht.

    PS: Ja, die Fragen waren nicht nur verständlich, dein ganzer Beitrag ist sauber gemacht: Sinnvolles topic, kleines Codebeispiel 👍



  • Super danke für die extrem schnellen (und auch verständlichen ;)) Antworten von euch beiden. Einen schönen Abend noch 🙂


Anmelden zum Antworten