© Éditions Eyrolles
199
chapitre n° 11
La gestion dynamique de la mémoire
Dans cet exemple, vous pouvez constater que l’allocation d’une zone de 100 octets nécessite
en fait un peu plus de place mémoire (exactement 104 octets). La différence (4 octets) correspond à des « octets de service » dans lesquels le système place les informations nécessaires
à sa gestion dynamique de la mémoire.
La norme prévoit que malloc alloue convenablement de l’espace, en tenant compte d’éventuelles
contraintes d’alignement de l’objet concerné. Or, en toute rigueur, malloc n’a pas d’information
précise sur le type de l’objet (elle n’en a que la longueur !). Dans ces conditions, le respect de
la norme peut prendre des allures différentes suivant l’implémentation :
• alignement basé sur la taille demandée,
• alignement systématique tenant compte de la contrainte d’alignement la plus forte.
Dans tous les cas, bien sûr, aucun risque n’existe. Simplement, la taille mémoire réellement
utilisée pourra, pour un type donné, différer d’une implémentation à une autre (notez qu’en
toute rigueur c’est déjà ce qui se produit avec les octets de service dont le nombre peut varier
avec l’implémentation).
2 D’autres outils de gestion dynamique : calloc et realloc
Bien qu’elles soient moins fondamentales que les précédentes, les deux fonctions calloc et
realloc peuvent s’avérer pratiques dans certaines circonstances.
2.1 La fonction calloc
La fonction :
void * calloc ( size_t nb_blocs, size_t taille )
(stdlib.h)
alloue l’emplacement nécessaire à nb_blocs consécutifs, ayant chacun une taille de taille
octets.
Contrairement à ce qui se passait avec malloc, où le contenu de l’espace mémoire alloué était
imprévisible, calloc remet à zéro chacun des octets de la zone ainsi allouée.
La taille de chaque bloc, ainsi que leur nombre sont tous deux de type size_t. On voit ainsi
qu’il est possible d’allouer en une seule fois une place mémoire (de plusieurs blocs) beaucoup
plus importante que celle allouée par malloc (la taille limite théorique étant maintenant
size_t*size_t au lieu de size_t).
Delannoy Livre.book Page 199 Mercredi, 6. mai 2009 4:26 16
Précédent

- 212/281

Suivant