.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de) .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" 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 "6 mars 2019" GNU "Manuel du programmeur Linux" .SH NOM malloc, free, calloc, realloc \- Allocation et libération dynamiques de mémoire .SH SYNOPSIS .nf \fB#include \fP .PP \fBvoid *malloc(size_t \fP\fIsize\fP\fB);\fP \fBvoid free(void \fP\fI*ptr\fP\fB);\fP \fBvoid *calloc(size_t \fP\fInmemb\fP\fB, size_t \fP\fIsize\fP\fB);\fP \fBvoid *realloc(void \fP\fI*ptr\fP\fB, size_t \fP\fIsize\fP\fB);\fP \fBvoid *reallocarray(void \fP\fI*ptr\fP\fB, size_t \fP\fInmemb\fP\fB, size_t \fP\fIsize\fP\fB);\fP .fi .PP .in -4n Exigences de macros de test de fonctionnalités pour la glibc (consulter \fBfeature_test_macros\fP(7))\ : .in .PP \fBreallocarray\fP() : .ad l _GNU_SOURCE Depuis la glibc 2.29: _DEFAULT_SOURCE Pour la glibc 2.28 et antérieure: _GNU_SOURCE .ad .SH DESCRIPTION .PP .\" glibc does this: La fonction \fBmalloc\fP() alloue \fIsize\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 \fIsize\fP est nulle, \fBmalloc\fP renvoie soit NULL ou un unique pointeur qui pourra être passé ultérieurement à \fBfree\fP() avec succès. .PP 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(), \fBcalloc\fP() ou \fBrealloc\fP(). Autrement, ou si \fIfree(ptr)\fP a déjà été appelé précédemment, le comportement est indéterminé. Si \fIptr\fP est NULL, aucune opération n'est effectuée. .PP .\" glibc does this: La fonction \fBcalloc\fP() alloue la mémoire nécessaire pour un tableau de \fInmemb\fP éléments de \fIsize\fP octets chacun, et renvoie un pointeur vers la mémoire allouée. Cette zone mémoire est remplie avec des zéros. Si \fInmemb\fP ou si \fIsize\fP est nulle, \fBcalloc\fP renvoie alors NULL ou un unique pointeur qui pourra être passé ultérieurement à \fBfree\fP() avec succès. Si la multiplication de \fInmemb\fP et \fIsize\fP résulte en un dépassement d'entier, \fBcalloc\fP() renverra alors une erreur. En revanche, un dépassement d'entier ne serait pas détecté dans l'appel suivant à \fBmalloc\fP(), mais aurait pour conséquence l'allocation d'un bloc mémoire de taille incorrecte\ : .PP .in +4n .EX malloc(nmemb * size); .EE .in .PP La fonction \fBrealloc\fP() modifie la taille du bloc de mémoire pointé par \fIptr\fP à \fIsize\fP octets. Le contenu de la mémoire entre la zone de départ et le minimum des nouvelle et 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 \fIpas\fP initialisé. Si \fIptr\fP est NULL, l'appel est équivalent à \fImalloc(size)\fP, pour toute valeur de \fIsize\fP\ ; si \fIsize\fP vaut zéro et que \fIptr\fP est non NULL, l'appel est alors équivalent à \fIfree(ptr)\fP. Si \fIptr\fP n'est pas NULL, il doit avoir été obtenu par un appel antérieur à \fBmalloc\fP(), \fBcalloc\fP() ou \fBrealloc\fP(). Si la zone pointée était déplacée, un appel à \fIfree(ptr)\fP est effectué. .PP La fonction \fBreallocarray\fP() change la taille du bloc mémoire pointé par \fIptr\fP pour qu'il soit suffisamment grand pour contenir un tableau de \fInmemb\fP éléments faisant chacun \fIsize\fP octets. C'est équivalent à l'appel .PP .in +4n realloc(ptr, nmemb * size); .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 NULL, fixe \fIerrno\fP à \fBENOMEM\fP et laisse le bloc mémoire originel inchangé. .SH "VALEUR RENVOYÉE" Les fonctions \fBmalloc\fP() et \fBcalloc\fP() renvoient un pointeur vers la mémoire allouée, qui est correctement alignée pour n'importe quel type interne. Si elles échouent, elles renvoient NULL. NULL peut également être renvoyé par un appel réussi à \fBmalloc\fP() avec un argument \fIsize\fP égal à zéro, ou par un appel réussi de \fBcalloc\fP() avec \fInmemb\fP ou \fIsize\fP égal à zéro. .PP La fonction \fBfree\fP() ne renvoie pas de valeur. .PP La fonction \fBrealloc\fP() renvoie un pointeur sur la mémoire nouvellement allouée, qui est correctement alignée pour n'importe quel type interne, et qui peut être différent de \fIptr\fP, ou NULL si la demande échoue. Si \fIsize\fP vaut zéro, \fBrealloc\fP() renvoie NULL ou un pointeur acceptable pour \fBfree\fP(). Si \fBrealloc\fP() échoue, le bloc mémoire original reste intact, il n'est ni libéré ni déplacé. .PP En cas de succès, la fonction \fBreallocarray\fP() renvoie un pointeur sur la mémoire nouvellement allouée. En cas d'échec, NULL est renvoyé et le bloc mémoire originel n'est pas modifié. .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). .SH ATTRIBUTS Pour une explication des termes utilisés dans cette section, consulter \fBattributes\fP(7). .TS allbox; lbw20 lb lb l l l. Interface Attribut Valeur T{ \fBmalloc\fP(), \fBfree\fP(), .br \fBcalloc\fP(), \fBrealloc\fP() T} Sécurité des threads MT\-Safe .TE .SH CONFORMITÉ \fBmalloc\fP(), \fBfree\fP(), \fBcalloc\fP(), \fBrealloc\fP()\ : POSIX.1\-2001, POSIX.1\-2008, C89, C99. .PP \fBreallocarray\fP() est une extension non standard apparue pour la première fois dans OpenBSD\ 5.6 et FreeBSD\ 11.0. .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 seront 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\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 SUSv2 contraint \fBmalloc\fP(), \fBcalloc\fP() et \fBrealloc\fP() à positionner \fIerrno\fP à \fBENOMEM\fP 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 \fBmalloc\fP() qui ne positionne pas \fIerrno\fP, certaines routines de bibliothèques peuvent échouer sans indiquer de raison dans \fIerrno\fP. .PP Lorsqu'un programme échoue durant un appel à \fBmalloc\fP(), \fBcalloc\fP(), \fBrealloc\fP() ou \fBfree\fP(), cela est presque toujours le signe d'une corruption du tas. Cela 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. .PP L'implémentation de \fBmalloc\fP() est personnalisable à l'aide des variables d'environnement. Pour plus de précisions, consultez \fBmallopt\fP(3). .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 . .SH COLOPHON Cette page fait partie de la publication\ 5.04 du projet \fIman\-pages\fP Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse \%https://www.kernel.org/doc/man\-pages/. .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 et Grégoire Scano . 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. 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 .