Grundlagen der Programmiersprache C
Warum wird in C empfohlen, unmittelbar nach free(p); die Anweisung p = NULL; zu schreiben?
- AOhne die Zuweisung von NULL wird der freigegebene Bereich nicht wieder nutzbar, und es entsteht ein Speicherleck
- Bp zeigt weiterhin auf den freigegebenen Bereich; die Zuweisung verhindert doppelte Freigaben und Zugriffe nach der Freigabe und macht solche Fehler leichter auffindbar
- Cfree setzt p automatisch auf NULL, und zur Sicherheit wird derselbe Wert zur Kontrolle noch einmal geschrieben
Antwort und Erläuterung anzeigen
Antwort: B. p zeigt weiterhin auf den freigegebenen Bereich; die Zuweisung verhindert doppelte Freigaben und Zugriffe nach der Freigabe und macht solche Fehler leichter auffindbar
free(p) gibt den Bereich frei, auf den p gezeigt hat, doch die Variable p behält ihren Wert (die Adresse). Liest oder schreibt man danach *p, ist das ein Zugriff nach der Freigabe (Use-after-free); ruft man free(p) erneut auf, ist das eine doppelte Freigabe. Beides ist undefiniertes Verhalten und kann die Verwaltungsdaten des Heap-Speichers beschädigen, sodass Fehler an ganz anderer Stelle auftreten. Steht in p NULL, richtet eine doppelte Freigabe keinen Schaden an, da free(NULL) laut Festlegung nichts tut, und eine NULL-Prüfung vor der Verwendung deckt den Fehler auf. Andere Zeiger-Variablen, die auf denselben Bereich zeigen, erfordern jedoch eigene Aufmerksamkeit.
Weiter: 9 weitere Fragen zu Grundlagen der Programmiersprache C