ProgrammationDéveloppeur C

Décrivez le mécanisme de travail de l'allocation et de la libération dynamiques de la mémoire en C, les fonctions principales (malloc, calloc, realloc, free) et les erreurs courantes lors de leur utilisation.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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.

Question piégeuse

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.

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


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 free deux 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.