MALLOC(3) Linux Programmeurs Handleiding MALLOC(3)
NAAM
malloc, free, calloc, realloc - reserveren en vrijmaken van dynamisch
geheugen
SAMENVATTING#include <stdlib.h>void *malloc(size_t grootte);void free(void *wzr);void *calloc(size_t nmemb, size_t grootte);void *realloc(void *wzr, size_t grootte);void *reallocarray(void *wzr, size_t nmemb, size_t grootte);
Test Macro´s in glibc (zie feature_test_macros(7)):
reallocarray():
_GNU_SOURCE
Sinds glibc 2.29:
_DEFAULT_SOURCE
Glibc 2.28 en eerder:
_GNU_SOURCE
BESCHRIJVING
De malloc() functie reserveert grootte bytes geheugen en geeft een wijzer
naar het gereserveerde geheugen terug. Het geheugen wordt nietgeinitialiseerd. Als grootte gelijk is aan 0, dan retourneert malloc()
ofwel een NULL ofwel een unieke wijzer waarde sdie later kan worden mee
gegeven aan free().
De free() functie maakt de geheugen-ruimte waar wzr naar wijst vrij,
geheugen dat gereserveerd moet zijn door een eerdere aanroep naar
malloc(), calloc() of realloc(). Anders, of als free(wzr) al eerder werd
aangeroepen, ontstaat onbepaald gedrag. Als wzr NULL is wordt niets
gedaan.
De calloc() reserveert geheugen voor een tabel van nmemb elementen ter
van grootte bytes, en geeft een wijzer naar het toegewezen geheugen
terug. Het geheugen wordt ge`nul'd. Als nmemb of grootte gelijk is aan 0,
dan geeft calloc() ofwel een NULL terug ofwel een unieke wijzer waarde
die later succesvol mee gegeven kan worden aan free(). Als de
vermenigvuldiging van nmemb en grootte zou resulteren in een geheel getal
overloop, dan geeft calloc() een foutmelding. In tegenstelling tot dit
zou een geheel getal overloop niet opgemerkt worden in de volgende
aanroep van malloc(), met als resultaat dat een blok geheugen met een
niet correct grootte gereserveerd zou worden:
malloc(nmemb * grootte);
The realloc() function changes the size of the memory block pointed to
by ptr to size bytes. The contents will be unchanged in the range from
the start of the region up to the minimum of the old and new sizes. If
the new size is larger than the old size, the added memory will not be
initialized. If ptr is NULL, then the call is equivalent to
malloc(size), for all values of size; if size is equal to zero, and ptr
is not NULL, then the call is equivalent to free(ptr) (this behavior is
nonportable; see NOTES). Unless ptr is NULL, it must have been returned
by an earlier call to malloc(), calloc(), or realloc(). If the area
pointed to was moved, a free(ptr) is done.
De reallocarray() functie verandert de grootte van het blok aangewezen
door ptr om groot genoeg te zijn voor een tabel van nmemb elementen, elk
met een grootte van grootte bytes. Dit is equivalent aan de aanroep:
realloc(ptr, nmemb * grootte);
Echter, anders dan de realloc() aanroep, reallocarray() faalt veilig in
het geval dat de multiplicatie zou overlopen. Als zo een overloop
optreed, reallocarray() retourneert een NULL, zet errno op ENOMEM, en
laat het originele geheugen blok onveranderd.
EIND WAARDE
De calloc() en malloc() functies retourneren een wijzer naar het
gereserveerde geheugen, dat geschikt is opgelijnd voor elk ingebouwd
type. Bij een fout, retourneren deze functies NULL. NULL kan ook
teruggegeven worden succesvolle aanroep van malloc() met een grootte van
nul, of bij een succesvolle aanroep van calloc() met nmemb of grootte
gelijk aan nul.
De free() functie geeft geen waarde terug.
De realloc() functie retourneert een wijzer naar het nieuw gereserveerde
geheugen, dat geschikt is opgelijnd voor elk ingebouwd type of NULL als
de aanroep faalde. De teruggegeven wijzer kan van hetzelfde type zijn
als wzr als de reservering niet was verplaatst (b.v. er was ruimte om de
ruimte uit te breiden), of verschillend van wzr als de reservering was
verplaatst naar een nieuw adres. Als grootte gelijk was aan 0, wordt
ofwel NULL of een wijzer bruikbaar om door te geven aan free() terug
gegeven. Als realloc() faalt, dan wordt het originele blok niet
aangeraakt; het wordt niet vrijgegeven of verplaatst.
Bij succes geeft de reallocarray() functie een wijzer naar het nieuw
gereserveerde geheugen terug. Na falen, retourneert het NULL en het
originele blok geheugen wordt niet verandert.
FOUTENcalloc(), malloc(), realloc(), en reallocarray() kunnen falen met de
volgende fout:
ENOMEM Geen geheugen meer. Mogelijk, het programma bereikte de RLIMIT_AS
of RLIMIT_DATA limiet beschreven in getrlimit(2).
VERSIESreallocarray() verscheen voor het eerst in glibc in versie 2.26.
ATTRIBUTEN
Voor een uitleg van de termen in deze sectie, zie attributes(7).
┌─────────────────────────────────────────┬───────────────────┬─────────┐
│ Interface │ Attribuut │ Waarde │
├─────────────────────────────────────────┼───────────────────┼─────────┤
│ malloc(), free(), calloc(), realloc() │ Thread veiligheid │ MT-Safe │
└─────────────────────────────────────────┴───────────────────┴─────────┘
VOLDOET AANmalloc(), free(), calloc(), realloc(): POSIX.1-2001, POSIX.1-2008, C89,
C99.
reallocarray() is a niet-standard uitbreiding die voor het eerst
verscheen in OpenBSD 5.6 and FreeBSD 11.0.
OPMERKINGEN
Standaard volgt, Linux een optimistische geheugen toewijzing strategie.
Dit betekent dat wanneer malloc() 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
/proc/sys/vm/overcommit_memory en /proc/sys/vm/oom_adj in proc(5), en het
Linux kernel bron code bestand and the Linux
Documentation/vm/overcommit-accounting.rst.
Normaliter kent malloc() geheugen toe van de heap en past de grootte van
de heap aan zoals vereist, gebruikmakende van sbrk(2). Bij het toekennen
van blokken geheugen groter dan MMAP_THRESHOLD bytes kent de glibc
malloc() implementatie het geheugen toe als een private anoniem tabel met
behulp van mmap(2). MMAP_THRESHOLD is standaard 128 kB, maar is
instelbaar m.b.v. mallopt(3). Voor Linux 4.7 werden toekenningen gedaan
met mmap(2) niet beïnvloed door de RLIMIT_DATA bron limiet; vanaf Linux
4.7, wordt deze limiet afgedwongen voor toekenningen gedaan met mmap(2).
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 memory allocationareas zodra semafoor botsingen worden gedetecteerd. Elk gebied is een
grote geheugen regio die intern toegekend wordt door het systeem (m.b.v.
brk(2) of mmap(2)), en bewaakt met zijn eigen semaforen.
SUSv2 vereist malloc(2), calloc(), en realloc() om errno op ENOMEM te
zetten bij het falen. Glibc neemt aan dat dit wordt gedaan (en de glibc
versies van deze functies doen dit); als u een privé malloc
implementation gebruikt die errno niet zet, dan kunnen bibliotheek
routines falen zonder opgaaf van reden in errno.
Crashes in malloc(), calloc(), realloc(), of free() zijn bijna altijd
gerelateerd aan corruptie van de heap, zoals overlopen van een toegekend
gebied or twee keer vrij geven van dezelfde wijzer.
De malloc() implementatie is aanpasbaar via omgeving variabelen; zie
mallopt(3) voor details.
Nonportable behavior
The behavior of realloc() when size is equal to zero, and ptr is not
NULL, is glibc specific; other implementations may return NULL, and set
errno. Portable POSIX programs should avoid it. See realloc(3p).
ZIE OOKvalgrind(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)
Voor details over de GNU C library implementatie, zie
⟨https://sourceware.org/glibc/wiki/MallocInternals⟩.
COLOFON
Deze pagina is onderdeel van release 5.13 van het Linux
man-pages-project. Een beschrijving van het project, informatie over het
melden van bugs en de nieuwste versie van deze pagina zijn op
https://www.kernel.org/doc/man-pages/ te vinden.
VERTALING
De Nederlandse vertaling van deze handleiding is geschreven door Jos
Boersema <joshb@xs4all.nl>, Mario Blättermann
<mario.blaettermann@gmail.com> en Luc Castermans
<luc.castermans@gmail.com>
Deze vertaling is vrije documentatie; lees de GNU General Public License
Version 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ of later over de
Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID.
Indien U fouten in de vertaling van deze handleiding zou vinden, stuur
een e-mail naar debian-l10n-dutch@lists.debian.org ⟨⟩.
GNU 22 maart 2021 MALLOC(3)