Basis van programmeren in 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 en use zijn elders gedefinieerde functies. Wat is een probleem van de bovenstaande functie?
- AAls fill een waarde ongelijk aan 0 teruggeeft, keert de functie terug zonder buf vrij te geven, dus het gereserveerde gebied blijft achter zonder te worden vrijgegeven
- BDe retourwaarde van malloc wordt niet gecontroleerd, dus bij een mislukte reservering wordt een NULL-pointer gederefereerd
- Cbuf wordt na free gebruikt, dus een vrijgegeven gebied wordt benaderd
Antwoord en toelichting tonen
Antwoord: A. Als fill een waarde ongelijk aan 0 teruggeeft, keert de functie terug zonder buf vrij te geven, dus het gereserveerde gebied blijft achter zonder te worden vrijgegeven
Een met malloc gereserveerd gebied blijft bestaan tot het met free wordt vrijgegeven. Op het pad waarbij fill mislukt en de functie met return -2 terugkeert, wordt free niet aangeroepen en gaat de waarde (het adres) van buf verloren, zodat dat gebied nooit meer kan worden vrijgegeven. Dit heet een geheugenlek; als de functie herhaaldelijk wordt aangeroepen, krimpt het bruikbare geheugen steeds verder, wat vooral een probleem is voor embedded apparaten en servers die lang draaien. Roep free(buf) aan vóór het terugkeren, of breng het vrijgeven samen op één plek aan het einde van de functie.