Man page - malloc(3)

Packages contains this manual

Available languages:

en fr pl nl ja de

Manual

malloc

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
malloc()
free()
calloc()
realloc()
reallocarray()
VALEUR RENVOYÉE
ERREURS
ATTRIBUTS
STANDARDS
HISTORIQUE
NOTES
Comportement non portable
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

malloc, free, calloc, realloc, reallocarray — Allocation et libĂ©ration de mĂ©moire dynamique

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <stdlib.h>

void *malloc(size_t taille );
void free(void *_Nullable
ptr );
void *calloc(size_t
nmemb , size_t taille );
void *realloc(void *_Nullable
ptr , size_t taille );
void *reallocarray(void *_Nullable
ptr , size_t nmemb , size_t size );

Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros (7)) :

reallocarray () :
Depuis la glibc 2.29 :
_DEFAULT_SOURCE
glibc 2.28 et précédentes :
_GNU_SOURCE

DESCRIPTION

malloc()

La fonction malloc () alloue taille octets et renvoie un pointeur sur la mĂ©moire allouĂ©e. Le contenu de la zone de mĂ©moire n’est pas initialisĂ© . Si taille est nulle, malloc renvoie une valeur de pointeur unique qui pourra ĂȘtre passĂ©e ultĂ©rieurement Ă  free () avec succĂšs (consulter « Comportement non portable » pour les problĂšmes de portabilitĂ©).

free()

La fonction free () libĂšre l’espace mĂ©moire pointĂ© par ptr qui doit avoir Ă©tĂ© obtenu lors d’un appel antĂ©rieur Ă  malloc () ou une fonction de la mĂȘme famille. Autrement, ou si ptr a dĂ©jĂ  Ă©tĂ© libĂ©rĂ©, le comportement est indĂ©terminĂ©. Si ptr est NULL, aucune opĂ©ration n’est effectuĂ©e.

calloc()

La fonction calloc () alloue de la mĂ©moire pour un tableau de nmemb Ă©lĂ©ments de taille taille octets chacun et renvoie un pointeur sur la mĂ©moire allouĂ©e. La zone mĂ©moire est initialisĂ©e Ă  0. Si nmemb ou taille vaut 0, calloc () renvoie alors une valeur de pointeur unique qui pourra ĂȘtre passĂ©e ultĂ©rieurement Ă  free () avec succĂšs.

Si la multiplication de nmemb par taille provoque un dĂ©passement d’entier, calloc () renvoie une erreur. Par contre, aucun dĂ©passement d’entier ne serait dĂ©tectĂ© lors de l’appel suivant Ă  malloc (), avec pour consĂ©quence l’allocation d’un bloc de mĂ©moire incorrectement dimensionné :

malloc(nmemb * taille);

realloc()

La fonction realloc () modifie la taille du bloc de mĂ©moire pointĂ© par ptr Ă  taille octets. Le contenu de la mĂ©moire entre la zone de dĂ©part et le minimum des ancienne et nouvelle tailles 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 Ă©gal Ă  NULL, l’appel est Ă©quivalent Ă  malloc(taille) pour toutes les valeurs de taille .

Si taille est Ă©gale Ă  zĂ©ro et si ptr est diffĂ©rent de NULL, l’appel est Ă©quivalent Ă  free(ptr) (consulter cependant « Comportement non portable » pour les problĂšmes de portabilitĂ©).

ExceptĂ© le cas oĂč ptr est Ă©gal Ă  NULL, il doit avoir Ă©tĂ© renvoyĂ© par un appel prĂ©cĂ©dent Ă  malloc ou Ă  une fonction de la mĂȘme famille. Si la zone pointĂ©e a Ă©tĂ© dĂ©placĂ©e, l’appel free(ptr) est effectuĂ©.

reallocarray()

La fonction reallocarray () dĂ©place Ă©ventuellement le bloc mĂ©moire pointĂ© par ptr et change sa taille pour qu’il soit suffisamment grand pour contenir un tableau de nmemb Ă©lĂ©ments faisant chacun taille octets. Elle Ă©quivaut Ă  l’appel

realloc(ptr, nmemb * taille);

Cependant, contrairement Ă  cet appel de realloc (), reallocarray () Ă©choue sans danger dans le cas oĂč la multiplication entraĂźnerait un dĂ©passement. Si un tel dĂ©passement se produit, reallocarray () renvoie une erreur.

VALEUR RENVOYÉE

Les fonctions malloc (), calloc (), realloc () et reallocarray () renvoient un pointeur vers la mĂ©moire allouĂ©e qui est correctement alignĂ©e pour n’importe quel type dont la taille correspondra Ă  la taille demandĂ©e ou sera infĂ©rieure Ă  cette derniĂšre. Si elles Ă©chouent, elles renvoient NULL et dĂ©finissent errno pour indiquer l’erreur. Essayer d’allouer plus que PTRDIFF_MAX octets est considĂ©rĂ© comme une erreur, car un objet de cette taille pourrait provoquer un dĂ©passement lors d’une soustraction de pointeur ultĂ©rieure.

La fonction free () ne renvoie aucune valeur et préserve errno .

Les fonction realloc () et reallocarray () renvoient NULL si ptr est diffĂ©rent de NULL et si la taille demandĂ©e est Ă©gale Ă  zĂ©ro, ce qui n’est pas considĂ©rĂ© comme une erreur (consulter « Comportement non portable » pour les problĂšmes de portabilitĂ©). Dans le cas contraire, le pointeur renvoyĂ© peut ĂȘtre identique Ă  ptr si la zone mĂ©moire n’a pas Ă©tĂ© dĂ©placĂ©e (par exemple s’il y a assez de place pour l’étendre Ă  son emplacement), ou peut ĂȘtre diffĂ©rent de ptr si la zone mĂ©moire a Ă©tĂ© dĂ©placĂ©e Ă  une nouvelle adresse. Si ces fonctions Ă©chouent, le bloc mĂ©moire originel reste intact ; il n’est ni libĂ©rĂ© ni dĂ©placĂ©.

ERREURS

calloc (), malloc (), realloc () et reallocarray () peuvent Ă©chouer avec l’erreur suivante :

ENOMEM

Plus de mĂ©moire. Il est possible que l’application ait atteint les limites RLIMIT_AS ou RLIMIT_DATA dĂ©crites dans getrlimit (2). Une autre raison pourrait ĂȘtre que le nombre de mappages créés par le processus appelant dĂ©passe la limite spĂ©cifiĂ©e par /proc/sys/vm/max_map_count .

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes (7).

Image grohtml-3876335-1.png

STANDARDS

malloc ()

free ()

calloc ()
realloc
()

C11, POSIX.1-2008.

reallocarray ()

Aucun.

HISTORIQUE

malloc ()

free ()

calloc ()
realloc
()

POSIX.1-2001, C89.

reallocarray ()

glibc 2.26. OpenBSD 5.6, FreeBSD 11.0.

Depuis la glibc 2.30, malloc () et les fonctions de la mĂȘme famille refusent les tailles supĂ©rieures Ă  PTRDIFF_MAX .

Depuis la glibc 2.33, free () préserve errno .

NOTES

Par dĂ©faut, Linux suit une stratĂ©gie d’allocation optimiste. Cela signifie que lorsque malloc () ne renvoie pas NULL, il n’y a aucune garantie que la mĂ©moire soit vĂ©ritablement disponible. S’il devait s’avĂ©rer que le systĂšme manque de mĂ©moire, un ou plusieurs processus seraient 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.rst 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 blocs 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 une projection anonyme privĂ©e avec mmap (2). MMAP_THRESHOLD vaut 128 ko par dĂ©faut et il est ajustable avec mallopt (3). Avant Linux 4.7, les allocations rĂ©alisĂ©es avec mmap (2) n’étaient pas affectĂ©es par la limitation de ressource RLIMIT_DATA ; depuis Linux 4.7, cette limite est aussi prise en compte pour les allocations faites avec mmap (2).

Pour Ă©viter les corruptions d’applications multithread, 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 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, 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.

Si votre programme utilise un allocateur de mĂ©moire privĂ©, il doit le faire en remplaçant malloc (), free (), calloc () et realloc (). Les fonctions de remplacement doivent implĂ©menter les comportements de la glibc documentĂ©s, y compris la gestion de errno , les allocations de taille nulle et la surveillance des dĂ©passements ; si ce n’est pas le cas, d’autres routines de la bibliothĂšque pourront se planter ou fonctionner de maniĂšre incorrecte. Par exemple, si la fonction qui remplace free () ne prĂ©serve pas errno , des routines de la bibliothĂšque apparemment sans rapport pourront Ă©chouer sans indiquer de raison valable dans errno . Un allocateur de mĂ©moire privĂ© devra peut-ĂȘtre aussi remplacer d’autres fonctions de la glibc ; consulter « Remplacer malloc » dans le manuel de la glibc pour plus de dĂ©tails.

L’échec d’un allocateur de mĂ©moire est presque toujours le signe d’une corruption du tas, Ă  l’instar d’un dĂ©bordement de bloc mĂ©moire allouĂ© ou d’une double libĂ©ration du mĂȘme pointeur.

L’implĂ©mentation de malloc () est personnalisable Ă  l’aide des variables d’environnement. Pour plus de prĂ©cisions, consultez mallopt (3).

Comportement non portable

Le comportement de ces fonctions lorsque la taille demandĂ©e est Ă©gale à 0 est spĂ©cifique Ă  la glibc ; d’autres implĂ©mentations peuvent renvoyer NULL sans dĂ©finir errno et les programmes POSIX portables doivent tenir compte de ces comportements. Consultez realloc (3p).

La norme POSIX exige des allocateurs de mĂ©moire qu’ils renseignent errno en cas d’erreur. Ce n’est cependant pas le cas de la norme C, et les applications portables vers des plateformes non-POSIX ne sont donc pas tenues de se plier Ă  cette contrainte.

Les programmes portables ne doivent pas utiliser d’allocateurs de mĂ©moire privĂ©s, car les normes C et POSIX ne permettent pas le remplacement des fonctions malloc (), free (), calloc () et realloc ().

EXEMPLES

#include <err.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MALLOCARRAY(n, type) ((type *) my_mallocarray(n, sizeof(type)))
#define MALLOC(type) MALLOCARRAY(1, type)
static inline void *my_mallocarray(size_t nmemb, size_t taille);
int
main(void)
{
char *p;
p = MALLOCARRAY(32, char);
if (p == NULL)
err(EXIT_FAILURE, "malloc");
strlcpy(p, "foo", 32);
puts(p);
}
static inline void *
my_mallocarray(size_t nmemb, size_t taille)
{
return reallocarray(NULL, nmemb, taille);
}

VOIR AUSSI

valgrind (1), 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)

Pour des dĂ©tails sur l’implĂ©mentation de la bibliothĂšque GNU C, consulter https://sourceware.org/glibc/wiki/MallocInternals .

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Grégoire Scano <gregoire.scano@malloc.fr> et Lucien Gentis <lucien.gentis@waika9.com>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .