In de C-taal kan het geheugen voor variabelen worden toegewezen op de stapel (stack) of in de heap (heap).
malloc, calloc, realloc, en moet handmatig worden vrijgegeven via free. De hoeveelheid geheugen is beperkt door de mogelijkheden van het systeem, maar de toegang is langzamer en het vrijgeven wordt handmatig gecontroleerd.Wanneer de stapel gebruiken:
Wanneer de heap gebruiken:
// Op de stapel int arr[10]; // In de heap int* parr = malloc(sizeof(int) * 10); // Vergeet niet het geheugen vrij te geven free(parr);
Vraag: Wat gebeurt er als je geen free-functie aanroept voor een array die is toegewezen via malloc?
Verlop: Er zal een geheugenlek optreden (memory leak). Dynamisch toegewezen geheugen wordt niet automatisch vrijgegeven, en na verloop van tijd kan dit leiden tot een geheugenuitputting van de applicatie of het volledige systeem.
void leak() { int* leakArr = malloc(100 * sizeof(int)); // Geen aanroep van free(leakArr), geheugen gaat verloren }
Verhaal
In één project wees programmeurs geheugen toe voor een structuur die een gebruikerssessie beschrijft via malloc, maar vergaten free aan te roepen aan het einde van het werk met de sessie. Als gevolg verloor het project gedurende enkele dagen geheugen en viel de server met een geheugenstekort-fout. Het probleem werd pas opgelost na profilering met Valgrind en het corrigeren van alle gemiste free-aanroepen.
Verhaal
Een ontwikkelaar wees een grote array (tot 10 MB) op de stapel toe voor tijdelijke berekeningen. Op een server met een kleine stapelgrootte leidde dit tot een crash van de applicatie met een stack overflow-fout. Na een analyse moest de buffer naar de heap worden verplaatst.
Verhaal
Een van de ontwikkelaars besloot lange strings op de stapel op te slaan, maar de grootte van de string werd subjectief door de gebruiker vastgesteld. Bij invoer van een zeer lange string viel de applicatie met een geheugenbedrijfsfout. Uiteindelijk werd besloten om de ingevoerde gegevens naar de heap te verplaatsen met een lengtecontrole.