.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de) .\" and Copyright 2007, 2012, 2018, Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" Modified Sat Jul 24 19:00:59 1993 by Rik Faith (faith@cs.unc.edu) .\" Clarification concerning realloc, iwj10@cus.cam.ac.uk (Ian Jackson), 950701 .\" Documented MALLOC_CHECK_, Wolfram Gloger (wmglo@dent.med.uni-muenchen.de) .\" 2007-09-15 mtk: added notes on malloc()'s use of sbrk() and mmap(). .\" .\" FIXME . Review http://austingroupbugs.net/view.php?id=374 .\" to see what changes are required on this page. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH malloc 3 "20 juillet 2023" "Pages du manuel de Linux 6.05.01" .SH NOM malloc, free, calloc, realloc, reallocarray — Allocation et libération de mémoire dynamique .SH BIBLIOTHÈQUE Bibliothèque C standard (\fIlibc\fP, \fI\-lc\fP) .SH SYNOPSIS .nf \fB#include \fP .PP \fBvoid *malloc(size_t \fP\fItaille\fP\fB);\fP \fBvoid free(void *_Nullable \fP\fIptr\fP\fB);\fP \fBvoid *calloc(size_t \fP\fInmemb\fP\fB, size_t \fP\fItaille\fP\fB);\fP \fBvoid *realloc(void *_Nullable \fP\fIptr\fP\fB, size_t \fP\fItaille\fP\fB);\fP \fBvoid *reallocarray(void *_Nullable \fP\fIptr\fP\fB, size_t \fP\fInmemb\fP\fB, size_t \fP\fIsize\fP\fB);\fP .fi .PP .RS -4 Exigences de macros de test de fonctionnalités pour la glibc (consulter \fBfeature_test_macros\fP(7))\ : .RE .PP \fBreallocarray\fP() : .nf Depuis la glibc 2.29 : _DEFAULT_SOURCE glibc 2.28 et précédentes : _GNU_SOURCE .fi .SH DESCRIPTION .SS malloc() La fonction \fBmalloc\fP() alloue \fItaille\fP octets et renvoie un pointeur sur la mémoire allouée. \fILe contenu de la zone de mémoire n'est pas initialisé\fP. Si \fItaille\fP est nulle, \fBmalloc\fP renvoie une valeur de pointeur unique qui pourra être passée ultérieurement à \fBfree\fP() avec succès (consulter «\ Comportement non portable\ » pour les problèmes de portabilité). .SS free() La fonction \fBfree\fP() libère l'espace mémoire pointé par \fIptr\fP qui doit avoir été obtenu lors d'un appel antérieur à \fBmalloc\fP() ou une fonction de la même famille. Autrement, ou si \fIptr\fP a déjà été libéré, le comportement est indéterminé. Si \fIptr\fP est NULL, aucune opération n'est effectuée. .SS calloc() La fonction \fBcalloc\fP() alloue de la mémoire pour un tableau de \fInmemb\fP éléments de taille \fItaille\fP octets chacun et renvoie un pointeur sur la mémoire allouée. La zone mémoire est initialisée à 0. Si \fInmemb\fP ou \fItaille\fP vaut 0, \fBcalloc\fP() renvoie alors une valeur de pointeur unique qui pourra être passée ultérieurement à \fBfree\fP() avec succès. .PP Si la multiplication de \fInmemb\fP par \fItaille\fP provoque un dépassement d'entier, \fBcalloc\fP() renvoie une erreur. Par contre, aucun dépassement d'entier ne serait détecté lors de l'appel suivant à \fBmalloc\fP(), avec pour conséquence l'allocation d'un bloc de mémoire incorrectement dimensionné\ : .PP .in +4n .EX malloc(nmemb * taille); .EE .in .SS realloc() La fonction \fBrealloc\fP() modifie la taille du bloc de mémoire pointé par \fIptr\fP à \fItaille\fP 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 \fIpas\fP initialisé. .PP Si \fIptr\fP est égal à NULL, l'appel est équivalent à \fImalloc(taille)\fP pour toutes les valeurs de \fItaille\fP. .PP Si \fItaille\fP est égale à zéro et si \fIptr\fP est différent de NULL, l'appel est équivalent à \fIfree(ptr)\fP (consulter cependant «\ Comportement non portable\ » pour les problèmes de portabilité). .PP Excepté le cas où \fIptr\fP est égal à NULL, il doit avoir été renvoyé par un appel précédent à \fBmalloc\fP ou à une fonction de la même famille. Si la zone pointée a été déplacée, l'appel \fIfree(ptr)\fP est effectué. .SS reallocarray() La fonction \fBreallocarray\fP() déplace éventuellement le bloc mémoire pointé par \fIptr\fP et change sa taille pour qu'il soit suffisamment grand pour contenir un tableau de \fInmemb\fP éléments faisant chacun \fItaille\fP octets. Elle équivaut à l'appel .PP .in +4n .EX realloc(ptr, nmemb * taille); .EE .in .PP Cependant, contrairement à cet appel de \fBrealloc\fP(), \fBreallocarray\fP() échoue sans danger dans le cas où la multiplication entraînerait un dépassement. Si un tel dépassement se produit, \fBreallocarray\fP() renvoie une erreur. .SH "VALEUR RENVOYÉE" Les fonctions \fBmalloc\fP(), \fBcalloc\fP(), \fBrealloc\fP() et \fBreallocarray\fP() 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 \fIerrno\fP pour indiquer l'erreur. Essayer d'allouer plus que \fBPTRDIFF_MAX\fP 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. .PP La fonction \fBfree\fP() ne renvoie aucune valeur et préserve \fIerrno\fP. .PP Les fonction \fBrealloc\fP() et \fBreallocarray\fP() renvoient NULL si \fIptr\fP 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 à \fIptr\fP 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 \fIptr\fP 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é. .SH ERREURS \fBcalloc\fP(), \fBmalloc\fP(), \fBrealloc\fP() et \fBreallocarray\fP() peuvent échouer avec l'erreur suivante\ : .TP \fBENOMEM\fP Plus de mémoire. Il est possible que l'application ait atteint les limites \fBRLIMIT_AS\fP ou \fBRLIMIT_DATA\fP décrites dans \fBgetrlimit\fP(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 \fI/proc/sys/vm/max_map_count\fP. .SH ATTRIBUTS Pour une explication des termes utilisés dans cette section, consulter \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Interface Attribut Valeur T{ .na .nh \fBmalloc\fP(), \fBfree\fP(), \fBcalloc\fP(), \fBrealloc\fP() T} Sécurité des threads MT\-Safe .TE .sp 1 .SH STANDARDS .TP \fBmalloc\fP() .TQ \fBfree\fP() .TQ \fBcalloc\fP() .TQ \fBrealloc\fP() C11, POSIX.1\-2008. .TP \fBreallocarray\fP() Aucun. .SH HISTORIQUE .TP \fBmalloc\fP() .TQ \fBfree\fP() .TQ \fBcalloc\fP() .TQ \fBrealloc\fP() POSIX.1\-2001, C89. .TP \fBreallocarray\fP() glibc 2.26. OpenBSD 5.6, FreeBSD 11.0. .PP Depuis la glibc 2.30, \fBmalloc\fP() et les fonctions de la même famille refusent les tailles supérieures à \fBPTRDIFF_MAX\fP. .PP Depuis la glibc 2.33, \fBfree\fP() préserve \fIerrno\fP. .SH NOTES Par défaut, Linux suit une stratégie d'allocation optimiste. Cela signifie que lorsque \fBmalloc\fP() 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 \fI/proc/sys/vm/overcommit_memory\fP et \fI/proc/sys/vm/oom_adj\fP dans \fBproc\fP(5), ainsi que le fichier \fIDocumentation/vm/overcommit\-accounting.rst\fP des sources du noyau Linux. .PP En général, \fBmalloc\fP() alloue la mémoire depuis le tas, et ajuste la taille du tas en conséquence avec \fBsbrk\fP(2). Lorsque les blocs de mémoire alloués sont plus larges que \fBMMAP_THRESHOLD\fP octets, l'implémentation de la glibc de \fBmalloc\fP alloue la mémoire selon une projection anonyme privée avec \fBmmap\fP(2). \fBMMAP_THRESHOLD\fP vaut 128\ ko par défaut et il est ajustable avec \fBmallopt\fP(3). Avant Linux\ 4.7, les allocations réalisées avec \fBmmap\fP(2) n’étaient pas affectées par la limitation de ressource \fBRLIMIT_DATA\fP\ ; depuis Linux\ 4.7, cette limite est aussi prise en compte pour les allocations faites avec \fBmmap\fP(2). .PP 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 \fIdomaines d'allocation mémoire\fP 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 \fBbrk\fP(2) ou \fBmmap\fP(2)) et géré avec ses propres mutex. .PP Si votre programme utilise un allocateur de mémoire privé, il doit le faire en remplaçant \fBmalloc\fP(), \fBfree\fP(), \fBcalloc\fP() et \fBrealloc\fP(). Les fonctions de remplacement doivent implémenter les comportements de la glibc documentés, y compris la gestion de \fIerrno\fP, 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 \fIfree\fP() ne préserve pas \fIerrno\fP, des routines de la bibliothèque apparemment sans rapport pourront échouer sans indiquer de raison valable dans \fIerrno\fP. 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. .PP 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. .PP L'implémentation de \fBmalloc\fP() est personnalisable à l'aide des variables d'environnement. Pour plus de précisions, consultez \fBmallopt\fP(3). .SS "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 \fIerrno\fP et les programmes POSIX portables doivent tenir compte de ces comportements. Consultez \fBrealloc\fP(3p). .PP La norme POSIX exige des allocateurs de mémoire qu'ils renseignent \fIerrno\fP 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. .PP 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 \fBmalloc\fP(), \fBfree\fP(), \fBcalloc\fP() et \fBrealloc\fP(). .SH EXEMPLES .EX #include #include #include #include #include \& #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); } .EE .SH "VOIR AUSSI" .\" http://g.oswego.edu/dl/html/malloc.html .\" A Memory Allocator - by Doug Lea .\" .\" http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html .\" Linux Heap, Contention in free() - David Boreham .\" .\" http://www.citi.umich.edu/projects/linux-scalability/reports/malloc.html .\" malloc() Performance in a Multithreaded Linux Environment - .\" Check Lever, David Boreham .\" .ad l .nh \fBvalgrind\fP(1), \fBbrk\fP(2), \fBmmap\fP(2), \fBalloca\fP(3), \fBmalloc_get_state\fP(3), \fBmalloc_info\fP(3), \fBmalloc_trim\fP(3), \fBmalloc_usable_size\fP(3), \fBmallopt\fP(3), \fBmcheck\fP(3), \fBmtrace\fP(3), \fBposix_memalign\fP(3) .PP Pour des détails sur l'implémentation de la bibliothèque GNU\ C, consulter .UR https://sourceware.org/glibc/wiki/MallocInternals .UE . .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot , Grégoire Scano et Lucien Gentis . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .