En langage C, des fonctions de la bibliothèque stdlib.h sont utilisées pour la gestion dynamique de la mémoire :
malloc(size_t size) — alloue un bloc de mémoire d'une taille donnée. La mémoire n'est pas initialisée.calloc(size_t nmemb, size_t size) — alloue un bloc de mémoire pour un tableau de nmemb éléments d'une taille donnée et l'initialise à zéro.realloc(void *ptr, size_t size) — change la taille d'un bloc de mémoire précédemment alloué.free(void *ptr) — libère le bloc de mémoire précédemment alloué.Exemple d'utilisation :
int *arr = (int *)malloc(10 * sizeof(int)); if (arr == NULL) { // Gestion d'une erreur d'allocation de mémoire } // ... travail avec arr ... free(arr);
Il est important de toujours vérifier le résultat de l'allocation de la mémoire pour NULL et de ne pas oublier d'appeler free pour éviter les fuites de mémoire.
Quel sera le résultat du code suivant ?
int *arr = malloc(sizeof(int) * 5); free(arr); free(arr);
Réponse : L'appel répété à free pour la même zone de mémoire entraîne un comportement indéfini (undefined behavior). On ne peut libérer le même pointeur qu'une seule fois.
Histoire
Dans un projet d'automatisation des tests du système, il y avait des pannes régulières. Le coupable était la boucle système, où après chaque passage, on oubliait de libérer la mémoire allouée via
malloc. En raison de tests prolongés, le système "mangeait" toute la mémoire RAM et se bloquait.
Histoire
L'implémentation d'un tableau dynamique utilisait
realloc, sans vérifier le résultat de retour. En cas d'échec (realloc renvoyait NULL), le pointeur vers l'ancienne mémoire était perdu, entraînant une fuite de mémoire. Toute tentative ultérieure d'interaction avec la mémoire entraînait un segfault.
Histoire
On a demandé à un développeur d'intégrer un ancien module C, où la mémoire était libérée via
freedeux fois de suite pour un même pointeur. Dans la plupart des systèmes d'exploitation, aucune erreur ne se produisait, mais sur une nouvelle plateforme, l'application a commencé à se terminer de manière anormale, la cause a été découverte longtemps après : double-free.