In de programmeertaal C worden functies uit de bibliotheek stdlib.h gebruikt voor dynamisch geheugenbeheer:
malloc(size_t size) — toewijzen van een blok geheugen van de opgegeven grootte. Het geheugen is niet geïnitialiseerd.calloc(size_t nmemb, size_t size) — toewijzen van een blok geheugen voor een array van nmemb elementen van de opgegeven grootte en initialiseren met nullen.realloc(void *ptr, size_t size) — verandert de grootte van een eerder toegewezen geheugenblok.free(void *ptr) — geeft een eerder toegewezen blok vrij.Voorbeeldgebruik:
int *arr = (int *)malloc(10 * sizeof(int)); if (arr == NULL) { // Foutafhandeling voor geheugentoewijzing } // ... werken met arr ... free(arr);
Het is belangrijk om altijd de resultaten van geheugentoewijzing te controleren op NULL en niet te vergeten free aan te roepen om geheugenlekken te voorkomen.
Wat is het resultaat van de volgende code?
int *arr = malloc(sizeof(int) * 5); free(arr); free(arr);
Antwoord: Het herhaaldelijk aanroepen van free voor hetzelfde geheugen leidt tot ongedefinieerd gedrag (undefined behavior). Eenzelfde pointer kan maar één keer worden vrijgegeven.
Verhaal
In een project voor het automatiseren van testsystemen waren er regelmatig storingen. De schuldige bleek een systeemcyclus te zijn, waarbij na elke iteratie vergeten werd het geheugen, toegekend via
malloc, vrij te geven. Na lange tests "verslond" het systeem al het RAM-geheugen en bevroor.
Verhaal
De implementatie van een dynamische array gebruikte
realloczonder het resultaat van de terugkeer te controleren. Bij een mislukking (realloc gaf NULL terug) werd de pointer naar het oude geheugen verloren, wat leidde tot een geheugenlek. Een daaropvolgende poging om met het geheugen te werken resulteerde in een segmentatiefout.
Verhaal
Een ontwikkelaar kreeg de opdracht om een verouderde C-module te integreren, waarbij het geheugen twee keer achter elkaar werd vrijgegeven via
freevoor dezelfde referentie. Op de meeste besturingssystemen traden er geen fouten op, maar op een nieuw platform kwam de applicatie crasht; de oorzaak werd veel later ontdekt: double-free.