MALLOC
Section: Manuel du programmeur Linux (3) Updated: 21 juillet 2003 Index
NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
CONFORMITÉ
VOIR AUSSI
NOTES
TRADUCTION
NOM
malloc, calloc, free, realloc - Allocation et libération dynamiques de mémoire.
SYNOPSIS
#include <stdlib.h>
void * calloc (size_t nmemb, size_t size);
void * malloc (size_t size);
void free (void * ptr);
void * realloc (void * ptr, size_t size);
DESCRIPTION
calloc()
alloue la mémoire nécessaire pour un tableau de
nmemb
éléments, chacun d'eux représentant
size
octets, et renvoie un pointeur vers la mémoire allouée.
Cette zone est remplie avec des zéros.
malloc()
alloue
size
octets, et renvoie un pointeur sur la mémoire allouée.
Le contenu de la zone de mémoire n'est pas initialisé.
free()
libère l'espace mémoire pointé par
ptr,
qui a été obtenu lors d'un appel antérieur à
malloc(),
calloc()
ou
realloc().
Si le pointeur
ptr
n'a pas été obtenu par l'un de ces appels, ou si il a déjà été
libéré avec
free(),
le comportement est indéterminé.
Si
ptr
est
NULL,
aucune tentative de libération n'a lieu.
realloc()
modifie la taille du bloc de mémoire pointé par
ptr
pour l'amener à une taille de
size
octets.
realloc()
conserve le contenu de la zone mémoire minimum entre la nouvelle et l'ancienne
taille. Le contenu de la zone de mémoire nouvellement allouée n'est pas initialisé.
Si
ptr
est
NULL,
l'appel de realloc() est équivalent à
malloc(size).
Si size vaut zéro, l'appel est équivalent à
free(ptr).
Si
ptr
n'est pas
NULL,
il doit avoir été obtenu par un appel antérieur à
malloc(),
calloc()
ou
realloc().
VALEUR RENVOYÉE
Pour
calloc() et malloc(),
la valeur renvoyée est un pointeur sur la mémoire allouée, qui est
correctement alignée pour n'importe quel type de variable, ou
NULL
si la demande échoue.
free()
ne renvoie pas de valeur.
realloc()
renvoie un pointeur sur la mémoire nouvellement allouée, qui est
correctement alignée pour n'importe quel type de variable, et qui
peut être différent de
ptr,
ou
NULL
si la demande échoue. Si
size
vaut zéro, realloc renvoie NULL ou un pointeur acceptable pour
free().
Si
realloc()
échoue, le bloc mémoire original reste intact, il n'est ni libéré ni
déplacé.
CONFORMITÉ
ANSI-C
VOIR AUSSI
NOTES
Le standard Unix98 réclame que
malloc(),
calloc(),
et
realloc()
positionne
errno
à ENOMEM en cas d'échec. La Glibc suppose qu'il en est ainsi
(et les versions glibc de cette routine le font). Si vous utilisez
une implémentation personnelle de malloc qui ne positionne pas
errno,
certaines routines de bibliothèques peuvent échouer sans
donner de raison dans
errno.
Lorsqu'un programme se plante durant un appel à
malloc(),
calloc()
ou
realloc(),
ceci est presque toujours le signe d'une corruption du tas (zone de mémoire
dans laquelle sont allouées les variables dynamiques).
Ceci survient généralement en cas de débordement d'un bloc mémoire alloué,
ou en libérant deux fois le même pointeur.
Les versions récentes de la bibliothèque C de Linux (libc postérieures à
5.4.23) et la bibliothèque GNU libc 2.x incluent une implémentation de
malloc()
dont on peut configurer le comportement à l'aide de variables d'environnement.
Quand la variable
MALLOC_CHECK_
existe, les appels à
malloc()
emploient une implémentation spéciale, moins efficace mais plus tolérante
à l'encontre des bugs simples comme le double appel de
free()
avec le même argument, ou un débordement de buffer d'un seul octet (bugs
de surpassement d'une unité, ou oubli d'un caractère nul final d'une chaîne).
Il n'est toutefois pas possible de pallier toutes les erreurs de ce type,
et l'on risque de voir des fuites de mémoire se produire.
Si la variable
MALLOC_CHECK_
vaut zéro, toutes les corruptions du tas détectées sont ignorées
silencieusement; Si elle vaut 1 un message de diagnostique est affiché
sur stderr. Si cette variable vaut 2, la fonction abort()
est appelée immédiatement. Ce comportement est particulièrement utile car
un crash pourrait sinon se produire ultérieurement, et serait très difficile
à diagnostiquer.
Linux suit une stratégie d'allocation optimiste. Ceci signifie que lorsque
malloc ()
renvoie une valeur non-NULL, il n'y a aucune garantie que la mémoire soit
véritablement disponible. Dans le cas où le système manque de mémoire, un ou
plusieurs processus seront tués par l'infâme exterminateur de gestion
mémoire.
TRADUCTION
Christophe Blaess, 1996-2003.
|