.\" -*- 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 juli 2023" "Linux man\-pagina's 6.05.01" .SH NAAM malloc, free, calloc, realloc \- reserveren en vrijmaken van dynamisch geheugen .SH BIBLIOTHEEK Standard C bibliotheek (\fIlibc\fP, \fI\-lc\fP) .SH SAMENVATTING .nf \fB#include \fP .PP \fBvoid *malloc(size_t \fP\fIsize\fP\fB);\fP \fBvoid free(void *_Nullable \fP\fIptr\fP\fB);\fP \fBvoid *calloc(size_t \fP\fInmemb\fP\fB, size_t \fP\fIsize\fP\fB);\fP \fBvoid *realloc(void *_Nullable \fP\fIptr\fP\fB, size_t \fP\fIsize\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 Feature Test Macro´s eisen in glibc (zie \fBfeature_test_macros\fP(7)): .RE .PP \fBreallocarray\fP(): .nf Sinds glibc 2.29: _DEFAULT_SOURCE Glibc 2.28 en eerder: _GNU_SOURCE .fi .SH BESCHRIJVING .SS malloc() De \fBmalloc\fP() functie reserveert \fIgrootte\fP bytes geheugen en geeft een wijzer naar het gereserveerde geheugen terug. \fIHet geheugen wordt niet geinitialiseerd\fP. Als \fIgrootte\fP gelijk is aan 0, dan retourneert \fBmalloc\fP() een unieke wijzer waarde die later kan worden mee gegeven aan \fBfree\fP(). (Zie "Niet overdraagbaar gebrag" voor overdraagbaarheids onderwerpen) .SS free() De \fBfree\fP() functie geeft de geheugen\-ruimte waar \fIwzr\fP naar wijst vrij, geheugen dat gereserveerd moet zijn door een eerdere aanroep naar \fBmalloc\fP() of gerelateerde functies. Anders, of als \fIfree(wzr)\fP al eerder werd aangeroepen, ontstaat onbepaald gedrag. Als \fIwzr\fP \fBNULL\fP is wordt niets gedaan. .SS calloc() De \fBcalloc\fP() functie reserveert \fIgrootte\fP bytes geheugen en geeft een wijzer naar het gereserveerde geheugen terug. Het geheugen wordt met nul geïnitialiseerd. Als \fInmemb\fP of \fIgrootte\fP gelijk is aan 0, dan retourneert \fBcalloc\fP() een unieke wijzer waarde die later succesvol kan worden mee gegeven aan \fBfree\fP(). .PP Als de multiplicatie van \fInmemb\fP en \fIgrootte\fP zou resulteren in het overlopen van een geheel getal, dan geeft \fBcalloc\fP() een fout terug. In tegenstelling daarmee, zou het overlopen van een geheel getal niet gedetecteerd worden in de volgende aanroep van \fBmalloc\fP(), met als resultaat dat een geheugen blok van niet correct grootte zou worden toegewezen: .PP .in +4n .EX malloc(nmemb * grootte); .EE .in .SS realloc() De \fBrealloc\fP() functie verandert de grootte van het geheugen\-blok waar \fIwzr\fP naar wijst in \fIgrootte\fP bytes. De inhoud zal onveranderd blijven in het gebied dat begint bij het geheugen gebied tot aan het minimum van de oude en nieuwe grootte. Als de nieuwe grootte groter is dan de oude dan wordt het toegevoegde geheugen \fIniet\fP geïnitialiseerd. .PP Als \fIwzr\fP NULL is, dan is de aanroep equivalent aan \fImalloc(grootte)\fP, voor alle waarden van \fIgrootte\fP. .PP Als \fIgrootte\fP gelijk is aan nul, en \fIwzr\fP is niet NULL, dan is de aanroep equivalent aan \fIfree(ptr)\fP (echter zie "Niet overdraagbaar gedrag" voor overdraagbaarheid onderwerpen). .PP Behalve als \fIwzr\fP NULL is, zou het moeten zijn teruggegeven door een eerdere aanroep van \fBmalloc\fP() of gerelateerde functies. Als het gebied waar naar gewezen wordt verplaatst werd dan werd een \fIfree(wzr)\fP uitgevoerd. .SS reallocarray() De \fBreallocarray\fP() functie verandert de grootte van het blok (verplaatst dit mogelijk) aangewezen door \fIptr\fP om groot genoeg te zijn voor een tabel van \fInmemb\fP elementen, elk met een grootte van \fIgrootte\fP bytes. Dit is equivalent aan de aanroep: .PP .in +4n .EX realloc(ptr, nmemb * grootte); .EE .in .PP Echter, anders dan de \fBrealloc\fP() aanroep, \fBreallocarray\fP() faalt veilig in het geval dat de multiplicatie zou overlopen. Als zo een overloop optreed, \fBreallocarray\fP() retourneert een NULL. .SH "EIND WAARDE" De \fBmalloc\fP, \fBcalloc\fP(), \fBrealloc\fP() en \fBreallocarry\fP() functies retourneren een wijzer naar het gereserveerde geheugen, dat geschikt is opgelijnd voor elk ingebouwd type dat past in de beschikbare ruimte. Bij een fout, retourneren deze functies NULL en zetten \fIerrno\fP. Proberen te reserveren van meer dan \fBPTRDIFF_MAX\fP bytes wordt gezien als een fout, omdat een object van deze grootte later kan leiden tot overlopen bij het aftrekken van wijzers. .PP De \fBfree\fP() functie geeft geen waarde terug, en behoudt \fIerrno\fP. .PP De \fBrealloc\fP() en \fBreallocarray\fP() functies retourneren een wijzer naar het nieuw gereserveerde geheugen, dat geschikt is opgelijnd voor elk ingebouwd type of NULL als de \fIwzr\fP niet NULL is en de gevraagde grootte nul is. (Zie "Niet overdraagbaar gedrag" voor overdraagbaarheids onderwerpen). dDe teruggegeven wijzer kan dezelfde zijn als \fIwzr\fP als de reservering niet was verplaatst (b.v. er was ruimte om de ruimte uit te breiden), of verschillend van \fIwzr\fP als de reservering was verplaatst naar een nieuw adres. Als deze functies falen, dan wordt het originele blok niet aangetast; het wordt niet verplaatst of vrij gegeven. .SH FOUTEN \fBcalloc\fP(), \fBmalloc\fP(), \fBrealloc\fP(), en \fBreallocarray\fP() kunnen falen met de volgende fout: .TP \fBENOMEM\fP Geen geheugen meer. Mogelijk, het programma bereikte de \fBRLIMIT_AS\fP of \fBRLIMIT_DATA\fP limiet beschreven in \fBgetrlimit\fP(2). Een andere reden zou kunnen zijn dat het aantal mappings die aangemaakt worden door het aanroepende proces de limiet zoals aangegeven door \fI/proc/sys/vm/max_map_count\fP hebben overschreden. .SH ATTRIBUTEN Voor een uitleg van de termen in deze sectie, zie \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Interface Attribuut Waarde T{ .na .nh \fBmalloc\fP(), \fBfree\fP(), \fBcalloc\fP(), \fBrealloc\fP() T} Thread veiligheid MT\-Safe .TE .sp 1 .SH "VOLDOET AAN" .TP \fBmalloc\fP() .TQ \fBfree\fP() .TQ \fBcalloc\fP() .TQ \fBrealloc\fP() C11, POSIX.1\-2008. .TP \fBreallocarray\fP() Geen. .SH GESCHIEDENIS .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 \fBmalloc\fP() en gerelateerde functies verwerpen groottes groter dan \fBPTRDIFF_MAX\fP vanaf glibc 2.30. .PP \fBfree\fP() behoudt \fIerrno\fP vanaf glibc 2.33. .SH OPMERKINGEN Standaard volgt, Linux een optimistische geheugen toewijzing strategie. Dit betekent dat wanneer \fBmalloc\fP() een niet\-NULL terug geeft returns dat er nog geen garantie is dat het geheugen ook daadwerkelijk beschikbaar is. In het geval dat blijkt dat het systeem geen vrij geheugen meer heeft, dan worden een of meer processen vernietigd door de OOM vernietiger. Voor meer informatie, zie de beschrijving van \fI/proc/sys/vm/overcommit_memory\fP en \fI/proc/sys/vm/oom_adj\fP in \fBproc\fP(5), en het Linux kernel bron code bestand and the Linux \fIDocumentation/vm/overcommit\-accounting.rst\fP. .PP Normaliter kent \fBmalloc\fP() geheugen toe van de heap en past de grootte van de heap aan zoals vereist, gebruikmakende van \fBsbrk\fP(2). Bij het toekennen van blokken geheugen groter dan \fBMMAP_THRESHOLD\fP bytes kent de glibc \fBmalloc\fP() implementatie het geheugen toe als een private anoniem tabel met behulp van \fBmmap\fP(2). \fBMMAP_THRESHOLD\fP is standaard 128 \ kB, maar is instelbaar m.b.v. \fBmallopt\fP(3). Voor Linux 4.7 werden toekenningen gedaan met \fBmmap\fP(2) niet beïnvloed door de \fBRLIMIT_DATA\fP bron limiet; vanaf Linux 4.7, wordt deze limiet afgedwongen voor toekenningen gedaan met \fBmmap\fP(2). .PP Om corruptie in multi\-threaded applicaties te vermijden worden semaforen intern gebruikt om geheugen\-management data structuren die deze functies gebruiken te beschermen. In een multi\-threaded application waarin threads gelijktijdig geheugen toekennen en vrijgeven kan er een botsing zijn voor deze semaforen. Om schaalbaar geheugen toekenning te kunnen afhandelen in een multi\-threaded applicatie creëert glibc additionele \fImemory allocation areas\fP zodra semafoor botsingen worden gedetecteerd. Elk gebied is een grote geheugen regio die intern toegekend wordt door het systeem (m.b.v. \fBbrk\fP(2) of \fBmmap\fP(2)), en bewaakt met zijn eigen semaforen. .PP Als uw programma een privé geheugen reservering gebruikt, dan dient het dit te doen door vervangen van \fBmalloc\fP(), \fBfree\fP(), \fBcalloc\fP(), en \fBrealloc\fP(). De vervangings functies moeten het gedocumenteerde glibc gedrag, inclusief \fIerrno\fP afhandeling, grootte\-nul toekenning, en controle van overloop implementeren, anders kunnen bibliotheek functies crashen of niet correct werken. Bij voorbeeld, als de vervanging van \fIfree\fP() \fIerrno\fP niet behoudt dan kunnen ogenschijnlijk niet gerelateerde bibliotheek functie falen zonder een geldige reden in \fIerrno\fP. Privé geheugen reserveringen kunnen ook andere glibc functies vervangen; zie "Vervangen van malloc" in de glibc handleiding voor details. .PP Crashes in bij het toewijzen van geheugen zijn bijna altijd gerelateerd aan corruptie van de heap, zoals overlopen van een toegekend gebied or twee keer vrij geven van dezelfde wijzer. .PP De \fBmalloc\fP() implementatie is aanpasbaar via omgeving variabelen; zie \fBmallopt\fP(3) voor details. .SS "Niet overdraagbaar gedrag" Het gedrag van deze functies wanneer de gevraagde grootte nul is, is glibc afhankelijk; andere implementaties kunnen NULL teruggeven zonder \fIerrno\fP te zetten. Overdraagbare POSIX programma´s moeten dit gedrag tolereren. Zie \fBrealloc\fP(3p). .PP POSIX vereist dat geheugen toewijzingen op \fIerrno\fP worden gezet bij een fout. Hoewel de C standaard dat niet vereist, en applicaties die overgezet worden naar niet\-POSIX platformen moeten hier niet van uit gaan. .PP Overdraagbare programma´s moeten geen privé geheugen reserveringen gebruiken, omdat POSIX en de C standaard geen vervanging van \fBmalloc\fP(), \fBfree\fP(), \fBcalloc\fP(), en \fBrealloc\fP() toestaan. .SH VOORBEELDEN .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 size); \& 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 size) { return reallocarray(NULL, nmemb, size); } .EE .SH "ZIE OOK" .\" 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 Voor details over de GNU C library implementatie, zie .UR https://sourceware.org/glibc/wiki/MallocInternals .UE . .PP .SH VERTALING De Nederlandse vertaling van deze handleiding is geschreven door Jos Boersema , Mario Blättermann en Luc Castermans . .PP Deze vertaling is vrije documentatie; lees de .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 .UE of later over de Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID. .PP Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar .MT debian-l10n-dutch@lists.debian.org .ME .