Qu'est-ce que Allocation dynamique de mémoire ?

Fait d'obtenir pendant l'exécution d'un programme de la mémoire de la taille nécessaire, puis de la libérer lorsqu'elle n'est plus utilisée. En C, malloc(taille) l'alloue et renvoie l'adresse de son début, et free(adresse) la libère. calloc renvoie une zone initialisée à zéro et realloc une zone redimensionnée. En cas d'échec, NULL est renvoyé : il faut donc vérifier le résultat. La zone se trouve dans le tas et survit aux retours de fonction jusqu'à sa libération. Sur les petits microcontrôleurs, on l'évite souvent à cause de la fragmentation et de durées d'allocation difficiles à prévoir.

Nom japonais: 動的メモリ確保

« Allocation dynamique de mémoire » apparaît dans 7 questions d'entraînement réparties sur 4 thèmes, dont Bases de la programmation en C, Éditeurs de liens, chargeurs et exécutables, Systèmes embarqués et firmware.

Domaine: Bases de la programmation en C

S'entraîner : questions sur Allocation dynamique de mémoire

De quelle zone du processus provient généralement la mémoire allouée par malloc en C ?

  1. ALa section .text
  2. BLe tas
  3. CLa section .rodata
Afficher la réponse et l'explication

Réponse : B. Le tas

Le tas est la zone où l'on alloue pendant l'exécution la quantité de mémoire nécessaire et où on la restitue par free lorsqu'elle n'est plus utile. Sa particularité est que la taille et la durée de vie des allocations peuvent être décidées à l'exécution. malloc gère lui-même l'espace libre et, lorsqu'il manque, demande à l'OS d'étendre la zone (appels système brk ou mmap sous Linux). Oublier free laisse subsister de la mémoire inutilisée : c'est une fuite de mémoire.

À force de répéter malloc et free, il peut devenir impossible d'allouer un grand bloc d'un seul tenant alors que la mémoire libre totale est suffisante. Comment appelle-t-on ce phénomène ?

  1. AFuite de mémoire
  2. BFragmentation
  3. CDébordement de pile
Afficher la réponse et l'explication

Réponse : B. Fragmentation

En répétant allocations et libérations de zones de tailles différentes, de petits espaces libres s'éparpillent entre les zones utilisées. Même si l'espace libre total est grand, sans grand espace libre contigu, une grande allocation échoue. C'est la fragmentation. Les allocateurs mémoire la réduisent en gérant séparément les tailles ou en fusionnant les espaces libres adjacents. Il faut y être particulièrement attentif dans les systèmes embarqués fonctionnant longtemps.

« Allocation dynamique de mémoire » dans les explications

Questions mentionnant « Allocation dynamique de mémoire » (7)

  1. De quelle zone du processus provient généralement la mémoire allouée par malloc en C ?
  2. À force de répéter malloc et free, il peut devenir impossible d'allouer un grand bloc d'un seul tenant alors que la mémoire libre totale est suffisante. Comment appelle-t-on ce phénomène ?
  3. Pourquoi le micrologiciel d'un petit microcontrôleur évite-t-il souvent l'allocation dynamique de mémoire, comme malloc ?
  4. En C, quelle association des durées de vie de (1) une variable locale déclarée sans static dans une fonction, (2) une zone allouée par malloc et (3) une variable déclarée hors de toute fonction est correcte ?
  5. Avec la politique de premier contact (first touch) couramment utilisée sur les systèmes NUMA sous Linux (la page est placée dans la mémoire du nœud où s’exécute le thread qui y écrit en premier), à quoi faut-il prendre garde ?
  6. fill et use sont des fonctions définies ailleurs. Quel est le problème de la fonction ci-dessus ?
  7. Quelle affirmation sur le pointeur renvoyé par la fonction make ci-dessus est correcte ?

Termes associés

Tas (heap) Fuite de mémoire (memory leak) Variable Pile (stack) Pointeur Fragmentation Microcontrôleur NUMA Défaut de page (page fault) Tableau

Retour au glossaire