Date création : 27-03-2008 20:23:44
 Vous êtes dans : GNU/Linux Astuces / Pages man [Section3 - Sous-fonctions]
MALLOC
Index
- NOM
- SYNOPSIS
- DESCRIPTION
- VALEUR RENVOYÉE
- CONFORMITÉ À
- VOIR AUSSI
- NOTES
- BOGUES
- 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 s'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(). Si la zone pointée était déplacée,
un free(ptr) est effectué.
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É À
C89, C99.
VOIR AUSSI
brk(2), posix_memalign(3)
NOTES
Le standard Unix98 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(), free() 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 libc de Linux (postérieures à
5.4.23) et de 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 bogues simples, comme le double appel de
free() avec le même argument, ou lors d'un débordement de tampon d'un
seul octet (bogues de surpassement d'une unité, ou oubli d'un caractère nul
final d'une chaîne). Il n'est toutefois pas possible de se protéger contre
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 elle 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.
BOGUES
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. C'est vraiment un
bogue ennuyeux. 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) . Dans le cas où Linux est utilisé dans des circonstances où il
n'est pas souhaitable de perdre soudainement des processus lancés
aléatoirement, et si de plus la version du noyau est suffisamment récente,
il est possible de désactiver ce comportement avec une commande comme
-
# echo 2 > /proc/sys/vm/overcommit_memory
Voir également les fichiers vm/overcommit-accounting et sysctl/vm.txt
dans le répertoire de la documentation du noyau.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par
Christophe Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003,
puis par Alain Portal <aportal AT univ-montp2 DOT fr> jusqu'en 2006.
La traduction de cette page de manuel est basée sur les traductions
disponibles sur http://manpagesfr.free.fr/,
mais est gérée par l'équipe francophone de traduction de Debian
au travers de la liste de discussion debian-l10n-french.
Veuillez signaler toute erreur de traduction 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> ».
|