Dans le langage C, la mémoire pour les variables peut être allouée soit dans la pile (stack), soit dans le tas (heap).
malloc, calloc, realloc, et est libérée manuellement via free. La quantité de mémoire est limitée par les capacités du système, mais l'accès est plus lent et la libération est contrôlée manuellement.Quand utiliser la pile :
Quand utiliser le tas :
// Dans la pile int arr[10]; // Dans le tas int* parr = malloc(sizeof(int) * 10); // N'oubliez pas de libérer la mémoire free(parr);
Q : Que se passe-t-il si un tableau alloué via malloc n’a pas de fonction free appelée ?
_R : Une fuite de mémoire (memory leak) se produira. La mémoire allouée dynamiquement ne sera pas libérée automatiquement, et au fil du temps, cela peut entraîner l'épuisement de la mémoire de l'application ou du système entier.
void leak() { int* leakArr = malloc(100 * sizeof(int)); // Pas d'appel à free(leakArr), la mémoire est perdue }
Histoire
Dans un projet, les programmeurs allouaient de la mémoire pour une structure décrivant une session utilisateur via malloc, mais ont oublié d'appeler free à la fin du travail avec la session. En conséquence, le projet perdait de la mémoire pendant plusieurs jours, et le serveur "tombait" avec une erreur de manque de mémoire. Le problème n'a été résolu qu'après le profilage avec Valgrind et la correction de tous les free manquants.
Histoire
Un développeur a alloué un grand tableau (jusqu'à 10 Mo) dans la pile pour des calculs temporaires. Sur un serveur avec une petite taille de pile, cela entraînait un crash de l'application avec une erreur de débordement de pile (stack overflow). Après analyse, il a fallu transférer le tampon vers le tas.
Histoire
Un des développeurs a décidé de stocker de longues chaînes dans la pile, mais la taille de la chaîne était soumise à l'entrée de l'utilisateur. Lors de l'entrée d'une très longue chaîne, l'application plantait avec une erreur d'accès à la mémoire. En fin de compte, il a été décidé de transférer les données saisies dans le tas avec un contrôle de longueur.