Grundlagen der Programmiersprache C
int process(int n) {
int *buf = malloc(n * sizeof(int));
if (buf == NULL) return -1;
if (fill(buf, n) != 0)
return -2;
use(buf, n);
free(buf);
return 0;
}fill und use seien separat definierte Funktionen. Welches Problem hat die obige Funktion?
- AGibt fill einen Wert ungleich 0 zurück, kehrt die Funktion zurück, ohne buf freizugeben, sodass der reservierte Bereich unfreigegeben bestehen bleibt
- BDer Rückgabewert von malloc wird nicht geprüft, daher wird bei einer fehlgeschlagenen Reservierung NULL dereferenziert
- Cbuf wird nach free verwendet, daher wird auf einen freigegebenen Bereich zugegriffen
Antwort und Erläuterung anzeigen
Antwort: A. Gibt fill einen Wert ungleich 0 zurück, kehrt die Funktion zurück, ohne buf freizugeben, sodass der reservierte Bereich unfreigegeben bestehen bleibt
Ein mit malloc reservierter Bereich bleibt bestehen, bis er mit free freigegeben wird. Auf dem Pfad, auf dem fill fehlschlägt und die Funktion mit return -2 zurückkehrt, wird free nicht aufgerufen, und auch der Wert (die Adresse) in buf geht verloren; der Bereich kann daher nie mehr freigegeben werden. Das nennt man ein Speicherleck. Wird die Funktion wiederholt aufgerufen, schrumpft der verfügbare Speicher immer weiter, was besonders bei lange laufenden Embedded-Geräten und Servern zum Problem wird. Abhilfe schafft ein Aufruf von free(buf) vor der Rückkehr oder das Zusammenfassen der Freigabe an einer einzigen Stelle am Ende der Funktion.
Weiter: 9 weitere Fragen zu Grundlagen der Programmiersprache C