Scroll to navigation

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 niet geinitialiseerd. 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);


De realloc() functie verandert de grootte van het geheugen-blok waar wzr naar wijst in grootte 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 niet geïnitialiseerd. Als wzr NULL is, dan is de aanroep gelijk aan malloc(grootte); als grootte gelijk aan nul is, dan is de aanroep gelijk aan free(wzr). Tenzij wzr NULL is, moet het teruggegeven zijn door een eerdere aanroep naar malloc(), calloc() of realloc(). Als het gebied waarnaar gewezen werd werd verplaatst dan wordt een free(wzr) uitgevoerd.

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.

FOUTEN

calloc(), 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).

VERSIES

reallocarray() 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 AAN

malloc(), 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 allocation areas 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.

ZIE OOK

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)

Voor details over de GNU C library implementatie, zie https://sourceware.org/glibc/wiki/MallocInternals.

COLOFON

Deze pagina is onderdeel van release 5.10 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 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.

9 juni 2020 GNU