Basis van programmeren in C
Wat is in C de meest passende reden waarom wordt aangeraden om direct na free(p); de regel p = NULL; te schrijven?
- AZonder toekenning van NULL komt het vrijgegeven gebied niet opnieuw beschikbaar, wat een geheugenlek veroorzaakt
- Bp blijft naar het vrijgegeven gebied wijzen, dus zo worden dubbele vrijgave en gebruik na vrijgave voorkomen en gemakkelijker gevonden
- Cfree zet p automatisch op NULL, maar dezelfde waarde nog eens schrijven dient als veiligheidscontrole
Antwoord en toelichting tonen
Antwoord: B. p blijft naar het vrijgegeven gebied wijzen, dus zo worden dubbele vrijgave en gebruik na vrijgave voorkomen en gemakkelijker gevonden
free(p) geeft het gebied vrij waarnaar p wees, maar de waarde (het adres) van de variabele p blijft ongewijzigd. Daarna *p lezen of schrijven is gebruik na vrijgave (use-after-free), en free(p) nog eens aanroepen is een dubbele vrijgave (double free); beide zijn ongedefinieerd gedrag en kunnen de beheerinformatie van de heap beschadigen, zodat een storing ergens ver weg optreedt. Als p op NULL wordt gezet, is de dubbele vrijgave onschadelijk, omdat vastligt dat free(NULL) niets doet, en een controle op NULL vóór gebruik brengt ook de fout aan het licht. Andere pointers die naar hetzelfde gebied wijzen, vragen nog steeds aparte aandacht.