Accueil
 1  Espace mémoire d'un processus
 2  Adresse mémoire
 3  Pointeur
 4  Allocation dynamique de mémoire
 4.1  Libération de mémoire
 4.2  Notions clés
   
   
   
   
 

 Contacts

W3C validator

Département INF  
 Titre du cours


4 Allocation dynamique de mémoire

  • void* malloc(size_t nb_bytes);
  • Alloue nb_bytes octets et retourne un pointeur sur la zone allouée
  • usage:
  • char* str = malloc(sizeof(char)* 128);
  • renvoie NULL en cas d’erreur (par ex: plus assez de mémoire)

Attention ! Risque de “fuite mémoire” si la mémoire allouée n’est jamais libérée

    previous     next 


Signification de void* Le void* renvoyé par malloc signifie que la fonction retourne un pointeur vers n’importe quel type de donnée. Ce pointeur (qui est donc une adresse) vers void peut être converti en pointeur (une adresse) vers int ou tout autre type.

Recommandation Vérifiez systématiquement si malloc vous a renvoyé NULL et, si c’est le cas, arrêtez votre programme. Une manière simple et lisible de faire cela est d’utiliser la macro assert (définie dans assert.h) comme dans l’exemple suivant :

  char* str = malloc(sizeof(char)* 128); 
  assert(str);

Fuites mémoire Lorsque l’on déclare une variable (un int, un tableau, une structure, ou toute autre variable) depuis une fonction foo, l’espace mémoire de cette variable est réservé sur la pile. Lorsque l’on sort de foo, la pile est “nettoyée” et l’espace réservé pour les variables locales est libéré.

Lorsque l’on alloue de la mémoire avec malloc depuis une fonction foo, la mémoire est allouée sur le tas. Lorsque l’on sort de la fonction foo, l’espace mémoire réservé reste accessible. Si on “perd” l’emplacement de cette zone mémoire, elle devient donc inaccessible, mais reste réservée: c’est une fuite mémoire.

Si la fuite mémoire fait “perdre” quelques octets à chaque appel de la fonction foo, la mémoire de la machine risque, à terme, d’être remplie de zones inutilisées. Le système d’exploitation n’ayant plus assez de mémoire pour exécuter des processus devra donc en tuer quelques uns pour libérer de la mémoire.

François Trahay, Télécom SudParis, CSC4103 – Programmation système, 2019–2020