NOM¶
malloc, free, calloc, realloc - Allocation et libération dynamiques de
mémoire
SYNOPSIS¶
#include <stdlib.h>
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
DESCRIPTION¶
La fonction
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é. Si
size est
nulle,
malloc renvoie soit NULL ou un unique pointeur qui pourra
être passé ultérieurement à
free() avec
succès.
La fonction
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 s'il a déjà été
libéré avec
free(ptr), le comportement est
indéterminé. Si
ptr est NULL, aucune opération
n'est effectuée.
La fonction
calloc() alloue la mémoire nécessaire pour un
tableau de
nmemb éléments de
size octets, et
renvoie un pointeur vers la mémoire allouée. Cette zone est
remplie avec des zéros. Si
nmemb ou si
size est nulle,
calloc renvoie soit NULL ou un unique pointeur qui pourra être
passé ultérieurement à
free() avec succès.
La fonction
realloc() modifie la taille du bloc de mémoire
pointé par
ptr à la taille de
size octets. Le
contenu de la mémoire entre la zone de départ et la plus petite
taille entre la nouvelle et l'ancienne taille n'est pas modifié. Si la
nouvelle taille est plus grande que l'ancienne taille, le contenu de la zone
de mémoire nouvellement allouée n'est pas initialisé. Si
ptr est NULL, l'appel est équivalent à
malloc(size), pour toute valeur de
size ; si
size
vaut zéro et
ptr est non NULL, l'appel est équivalent
à
free(ptr). Si
ptr est NULL, il doit avoir
été obtenu par un appel antérieur à
malloc(),
calloc() ou
realloc(). Si la zone
pointée était déplacée, un
free(ptr) est
effectué.
VALEUR RENVOYÉE¶
Les fonctions
malloc() et
calloc() renvoient un pointeur vers la
mémoire allouée, qui est correctement alignée pour
n'importe quel type intégré. Si elles échouent, elles
renvoient NULL. NULL peut également être renvoyé par un
appel réussi à
malloc() avec un paramètre
size égal à zéro, ou par un appel réussi de
calloc() avec
nmemb ou
size égal à
zéro.
La fonction
free() ne renvoie pas de valeur.
La fonction
realloc() renvoie un pointeur sur la mémoire
nouvellement allouée, qui est correctement alignée pour
n'importe quel type intégré, 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é.
C89, C99.
NOTES¶
Par défaut, 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 « OOM
killer » (gestionnaire de mémoire). Pour plus
d'informations, consultez la description de
/proc/sys/vm/overcommit_memory et
/proc/sys/vm/oom_adj dans
proc(5), ainsi que le fichier
Documentation/vm/overcommit-accounting des sources du noyau Linux.
En général,
malloc() alloue la mémoire depuis le
tas, et ajuste la taille du tas en conséquence avec
sbrk(2).
Lorsque les bloques de mémoire alloués sont plus larges que
MMAP_THRESHOLD octets, l'implémentation de la glibc de
malloc alloue la mémoire selon un projection anonyme
privée avec
mmap(2).
MMAP_THRESHOLD vaut 128 Ko
par défaut et il est ajustable avec
mallopt(3). Les allocations
réalisées avec
mmap(2) ne sont pas affectées par
la limitation de ressource
RLIMIT_DATA (consultez
getrlimit(2)).
Pour éviter les corruptions d'applications multithreadées, les
mutex sont utilisés en interne pour protéger les structures de
données de gestion de mémoire utilisées dans ces
fonctions. Dans une application multithreadée où les threads
allouent et libèrent la mémoire en même temps, ces mutex
risquent d'entrer en conflit. Pour gérer l'allocation de mémoire
de façon évolutive dans les applications multithreadées,
la glibc crée des
domaines d'allocation mémoire si
un conflit de mutex est détecté. Chaque domaine est un grand
espace de mémoire qui est alloué en interne par le
système (en utilisant
brk(2) ou
mmap(2)), et
géré avec ses propres mutex.
Le standard UNIX 98 nécessite que
malloc(),
calloc() et
realloc() positionnent
errno à
ENOMEM en cas
d'échec. La glibc suppose qu'il en est ainsi (et les versions glibc de
ces routines 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 échoue durant un appel à
malloc(),
calloc(),
realloc() ou
free(), ceci est presque toujours
le signe d'une corruption du tas. 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 dernières versions de libc Linux (depuis 5.4.23) et de glibc (2.x)
contiennent une implémentation de
malloc() qui est
personnalisable à l'aide des variables d'environnement. Pour plus de
précisions, consultez
mallopt(3).
VOIR AUSSI¶
brk(2),
mmap(2),
alloca(3),
malloc_get_state(3),
malloc_info(3),
malloc_trim(3),
malloc_usable_size(3),
mallopt(3),
mcheck(3),
mtrace(3),
posix_memalign(3)
COLOPHON¶
Cette page fait partie de la publication 3.65 du projet
man-pages Linux.
Une description du projet et des instructions pour signaler des anomalies
peuvent être trouvées à l'adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Christophe Blaess <
http://www.blaess.fr/christophe/> (1996-2003), Alain
Portal <
http://manpagesfr.free.fr/> (2003-2006). Florentin Duneau et
l'équipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce
document en utilisant la commande «
man -L C
<section>
<page_de_man> ».