Allocation mémoire
Les zones mémoire d'un processus, l'allocation statique, automatique et dynamique, malloc, calloc, realloc, free et sizeof en C, et les quatre fautes classiques : fuite, double libération, utilisation après libération et dépassement de tampon.
- 26 cartes
- 5 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Mises en situation
- Comprendre
Quelques cartes du deck
Zones mémoire d'un processus : de quoi s'agit-il ?
Voir la réponse
Découpage de l'espace d'adressage d'un programme en zones : le code, les données (globales et static), le tas et la pile.
Chaque zone donne sa durée de vie : une donnée globale ou static dure toute l'exécution, une variable de pile le temps de l'appel de sa fonction, un bloc du tas jusqu'à son
free.Ce code doit ranger
nentiers de typeint. Quelle est la faute ?
```c
int *t = malloc(n);`- Il réserve
noctets : il fautn * sizeof(int) - Il manque le cast
(int *)devantmalloc - Le pointeur
tdevrait être déclaré de typechar * - Il faut passer par
calloc,mallocne sert qu'aux chaînes
Voir la réponse
Il réserve
noctets : il fautn * sizeof(int)malloccompte en octets. Avec 4 octets parint,noctets ne contiennent quen / 4entiers : écrire les suivants déborde du bloc. En C, le cast du résultat demallocest inutile, car unvoid *se convertit tout seul.- Il réserve
Les blocs obtenus par
mallocvivent sur le …, alors que les variables locales d'une fonction vivent sur la ….Voir la réponse
Les blocs obtenus par
mallocvivent sur le tas, alors que les variables locales d'une fonction vivent sur la pile.La pile se vide toute seule au retour de la fonction ; le tas ne se vide que par des appels explicites à
free.Allocation dynamique : de quoi s'agit-il ?
Voir la réponse
Réservation d'un bloc de mémoire pendant l'exécution, dont la taille peut dépendre de données connues seulement à ce moment-là.
Le bloc est pris sur le tas et reste à toi jusqu'à ce que tu le rendes avec
free: ni la fin d'une fonction ni la fin d'un bloc ne le rendent.Un serveur écrit en C voit sa consommation de mémoire grimper de quelques kilo-octets à chaque requête, sans jamais redescendre, jusqu'à être tué. Quelle est la cause la plus probable ?
- La pile déborde car les requêtes s'empilent trop vite les unes sur les autres
- Les variables globales sont recopiées à chaque requête
- Le compilateur a mal calculé la taille des variables locales
- Un bloc alloué par requête n'est jamais rendu avec
free
Voir la réponse
Un bloc alloué par requête n'est jamais rendu avec
freeUne croissance lente et continue du tas est le signe d'une fuite. Un débordement de pile se produit d'un coup, par récursion ou gros tableau local, pas requête après requête.