Provided by: manpages-nl-dev_4.27.0-1_all bug

NAAM

       malloc, free, calloc, realloc - reserveren en vrijmaken van dynamisch geheugen

BIBLIOTHEEK

       Standard C bibliotheek  (libc, -lc)

SAMENVATTING

       #include <stdlib.h>

       void *malloc(size_t size);
       void free(void *_Nullable ptr);
       void *calloc(size_t nmemb, size_t size);
       void *realloc(void *_Nullable ptr, size_t size);
       void *reallocarray(void *_Nullable ptr, size_t nmemb, size_t size);

   Feature Test Macro´s eisen in  glibc (zie feature_test_macros(7)):

       reallocarray():
           Sinds glibc 2.29:
               _DEFAULT_SOURCE
           Glibc 2.28 en eerder:
               _GNU_SOURCE

BESCHRIJVING

   malloc()
       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()
       een unieke wijzer waarde die later kan worden mee gegeven aan free(). (Zie  "Niet  overdraagbaar  gebrag"
       voor overdraagbaarheids onderwerpen)

   free()
       De  free() functie geeft de geheugen-ruimte waar wzr naar wijst vrij, geheugen dat gereserveerd moet zijn
       door een eerdere aanroep naar malloc() of gerelateerde functies. Anders, of als free(wzr) al eerder  werd
       aangeroepen, ontstaat onbepaald gedrag. Als wzr NULL is wordt niets gedaan.

   calloc()
       De calloc() functie reserveert grootte bytes geheugen en geeft een wijzer naar het gereserveerde geheugen
       terug.  Het geheugen wordt met nul geïnitialiseerd. Als nmemb of grootte gelijk is aan 0, dan retourneert
       calloc() een unieke wijzer waarde die later succesvol kan worden mee gegeven aan free().

       Als de multiplicatie van nmemb en  grootte zou resulteren in het overlopen  van  een  geheel  getal,  dan
       geeft  calloc()  een  fout  terug.  In tegenstelling daarmee, zou het overlopen van een geheel getal niet
       gedetecteerd worden in de volgende aanroep van malloc(), met als resultaat dat  een  geheugen   blok  van
       niet correct grootte zou worden toegewezen:

           malloc(nmemb * grootte);

   realloc()
       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 equivalent aan malloc(grootte), voor alle waarden van grootte.

       Als  grootte  gelijk  is aan nul, en wzr is niet NULL, dan is de aanroep equivalent aan free(ptr) (echter
       zie "Niet overdraagbaar gedrag" voor overdraagbaarheid onderwerpen).

       Behalve als wzr NULL is, zou het moeten zijn teruggegeven  door  een  eerdere  aanroep  van  malloc()  of
       gerelateerde  functies.  Als  het  gebied  waar naar gewezen wordt verplaatst werd dan werd een free(wzr)
       uitgevoerd.

   reallocarray()
       De reallocarray() functie verandert de grootte van het blok (verplaatst dit mogelijk) 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.

EIND WAARDE

       De  malloc,  calloc(),  realloc() en reallocarry() 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 errno. Proberen te reserveren van meer dan PTRDIFF_MAX
       bytes wordt gezien als een fout, omdat een object van deze grootte later kan leiden tot overlopen bij het
       aftrekken van wijzers.

       De free() functie geeft geen waarde terug, en behoudt errno.

       De realloc() en reallocarray() functies retourneren een wijzer naar het nieuw gereserveerde geheugen, dat
       geschikt is opgelijnd voor elk ingebouwd type of NULL als de wzr niet NULL is en de gevraagde grootte nul
       is.  (Zie "Niet overdraagbaar gedrag" voor overdraagbaarheids onderwerpen). dDe teruggegeven  wijzer  kan
       dezelfde  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  deze
       functies falen, dan wordt het originele blok niet aangetast; het wordt niet verplaatst of vrij gegeven.

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). Een andere  reden  zou  kunnen  zijn  dat  het  aantal   mappings  die
              aangemaakt    worden   door   het   aanroepende   proces   de   limiet   zoals   aangegeven   door
              /proc/sys/vm/max_map_count hebben overschreden.

ATTRIBUTEN

       Voor een uitleg van de termen in deze sectie, zie attributes(7).
       ┌─────────────────────────────────────────────────────────────────────────┬───────────────────┬─────────┐
       │ InterfaceAttribuutWaarde  │
       ├─────────────────────────────────────────────────────────────────────────┼───────────────────┼─────────┤
       │ malloc(), free(), calloc(), realloc()                                   │ Thread veiligheid │ MT-Safe │
       └─────────────────────────────────────────────────────────────────────────┴───────────────────┴─────────┘

VOLDOET AAN

       malloc()
       free()
       calloc()
       realloc()
              C11, POSIX.1-2008.

       reallocarray()
              Geen.

GESCHIEDENIS

       malloc()
       free()
       calloc()
       realloc()
              POSIX.1-2001, C89.

       reallocarray()
              glibc 2.26.  OpenBSD 5.6, FreeBSD 11.0.

       malloc() en gerelateerde functies verwerpen groottes groter dan PTRDIFF_MAX vanaf glibc 2.30.

       free() behoudt errno vanaf glibc 2.33.

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.

       Als uw programma een privé geheugen reservering gebruikt, dan dient het dit te doen  door  vervangen  van
       malloc(),  free(),  calloc(),  en  realloc().  De  vervangings  functies moeten het gedocumenteerde glibc
       gedrag, inclusief errno afhandeling, grootte-nul toekenning,  en  controle  van  overloop  implementeren,
       anders  kunnen  bibliotheek functies crashen of niet correct werken. Bij voorbeeld, als de vervanging van
       free() errno niet behoudt dan kunnen ogenschijnlijk niet gerelateerde bibliotheek  functie  falen  zonder
       een  geldige reden in errno. Privé geheugen reserveringen kunnen ook andere glibc functies vervangen; zie
       "Vervangen van malloc" in de glibc handleiding voor details.

       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.

       De malloc()  implementatie is aanpasbaar via omgeving variabelen; zie mallopt(3)  voor details.

   Niet overdraagbaar gedrag
       Het  gedrag  van  deze  functies  wanneer  de  gevraagde  grootte  nul  is,  is glibc afhankelijk; andere
       implementaties kunnen NULL teruggeven zonder errno te zetten. Overdraagbare POSIX programma´s moeten  dit
       gedrag tolereren. Zie realloc(3p).

       POSIX  vereist  dat  geheugen  toewijzingen op errno 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.

       Overdraagbare  programma´s  moeten  geen  privé  geheugen  reserveringen  gebruiken,  omdat POSIX en de C
       standaard geen vervanging van malloc(), free(), calloc(), en realloc() toestaan.

VOORBEELDEN

       #include <err.h>
       #include <stddef.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>

       #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);
       }

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.

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.

Linux man-pagina's 6.9.1                           2 mei 2024                                          malloc(3)