Geschiedenis van de kwestie:
Mechanismen voor dynamische geheugenallocatie verschenen in C met de functies van de standaardbibliotheek malloc/free in <stdlib.h>. Ze maakten de implementatie van variabele-grootte structuren, complexe verzamelingen en objecten mogelijk, wat een sterke impuls gaf aan de ontwikkeling van de taal en het gebruik ervan in grootschalige programmering.
Probleem:
Werken met dynamisch geheugen vereist volledige controle van de programmeur over de levenscyclus van objecten. Fouten (geheugenlekken, dubbele vrijgave, onjuist gebruik van pointers) kunnen leiden tot crashes of kwetsbaarheden (bijvoorbeeld exploits door gebruik na vrijgave).
Oplossing:
— Controleer altijd de geretourneerde waarden van malloc/calloc/realloc. Als de toewijzing mislukt, retourneren ze NULL. — Bij het vrijgeven van geheugen moet de pointer naar NULL worden ingesteld om gebruik van de vrijgegeven blok te voorkomen. — Gebruik de pointer niet na free. — Zorg voor correcte koppeling tussen malloc/free en calloc/free.
Voorbeeldcode:
#include <stdio.h> #include <stdlib.h> int main() { int *arr = malloc(5 * sizeof(int)); if (!arr) { perror("Kon geheugen niet toewijzen"); return 1; } for (int i = 0; i < 5; ++i) arr[i] = i * i; for (int i = 0; i < 5; ++i) printf("%d ", arr[i]); printf(" "); free(arr); arr = NULL; return 0; }
Belangrijke kenmerken:
Wat gebeurt er als je geheugen dat met malloc is toegewezen, probeert te vrijgeven met de delete-operator of omgekeerd (in C++)?
Je kunt de mechanismen voor toewijzing en vrijgave van geheugen tussen talen (C/C++) niet mengen. In C — alleen malloc/free, in C++ — new/delete.
Wat gebeurt er als je probeert free(NULL) aan te roepen?
free(NULL) is veilig (dit is gegarandeerd door de C-standaard). Zo'n aanroep doet niets.
Kun je realloc gebruiken om een geheugenblok te vergroten of te verkleinen en wat gebeurt er met de originele pointer?
realloc kan het geheugenblok verplaatsen, en als dat gebeurt, wordt de oude pointer ongeldig. Ken altijd de nieuwe pointer toe:
ptr = realloc(ptr, new_size);
Geheugen toegewezen voor een array in een lus, maar vergeten vrij te geven aan het einde van de iteratie. 'S Nachts heeft het programma op de server al het RAM verbruikt.
Voordelen:
Nadelen:
In de lus hebben we altijd geheugen vrijgegeven na gebruik, alle controles op NULL werden onmiddellijk na malloc uitgevoerd, we gebruikten debugging-tools om op geheugenlekken te letten.
Voordelen:
Nadelen: