jammy (3) malloc.3.gz

Provided by: manpages-de-dev_4.13-4_all bug

BEZEICHNUNG

       malloc, free, calloc, realloc, reallocarray - dynamischen Speicher belegen und freigeben

ÜBERSICHT

       #include <stdlib.h>

       void *malloc(size_t Größe);
       void free(void *ptr);
       void *calloc(size_t nmemb, size_t Größe);
       void *realloc(void *ptr, size_t Größe);
       void *reallocarray(void *ptr, size_t nmemb, size_t Größe);

   Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

       reallocarray():
           Seit Glibc 2.29:
               _DEFAULT_SOURCE
           Glibc 2.28 und älter:
               _GNU_SOURCE

BESCHREIBUNG

       Die  Funktion  malloc()  belegt Größe Byte und gibt einen Zeiger auf den belegten Speicherbereich zurück.
       Der Speicher wird nicht initialisiert. Falls Größe 0 ist, wird malloc() entweder  NULL  zurückgeben  oder
       einen eindeutigen Zeigerwert, der später erfolgreich an free() übergeben werden kann.

       free()  gibt  den  Speicher  frei,  auf  den  ptr  zeigt, welcher von einem früheren Aufruf von malloc(),
       calloc() oder realloc() belegt worden sein muss.  Andernfalls  oder  wenn  free(ptr)  bereits  aufgerufen
       wurde, ist das Verhalten nicht definiert. Wenn ptr NULL ist, wird keine Operation ausgeführt.

       calloc()  belegt  Speicher  für ein Feld von nmemb Elementen von jeweils Größe Byte und gibt einen Zeiger
       auf den belegten Speicherbereich zurück. Der Speicher wird auf Null gesetzt. Falls  nmemb  oder  Größe  0
       ist,  gibt  calloc()  entweder  NULL  zurück oder einen eindeutigen Zeigerwert, der später erfolgreich an
       free() übergeben werden kann. Falls die Multiplikation von nmemb  und  Größe  zu  einem  Ganzzahlüberlauf
       führen  würde, dann liefert calloc() einen Fehler zurück. Im Gegensatz dazu würde ein Ganzzahlüberlauf in
       dem nachfolgenden Aufruf von malloc() nicht erkannt werden, was zu einer Zuweisung  eines  Speicherblocks
       mit falscher Größe führen würde:

           malloc(nmemb * Größe);

       realloc()  ändert  die  Größe  des  Speicherblocks,  auf den ptr zeigt, auf Größe Byte. Der Inhalt bleibt
       unverändert im Bereich vom Anfang des Speicherbereichs bis zum Minimum von alter und neuer  Größe.  Falls
       die  neue  Größe  die  alte  überschreitet,  wird der zusätzliche Speicher nicht initialisiert. Falls ptr
       gleich NULL ist, ist der Aufruf äquivalent zu malloc(Größe); falls die Größe gleich Null ist und ptr  ist
       von  NULL verschieden, ist der Aufruf äquivalent zu free(ptr). Wenn ptr nicht NULL ist, muss er von einem
       früheren Aufruf von malloc(), calloc() oder realloc() zurückgegeben worden sein. Falls der  Bereich,  auf
       den verwiesen wurde, verschoben wurde, wird free(ptr) aufgerufen.

       Die  Funktion  reallocarray() ändert die Größe des Speicherblocks, auf den ptr zeigt, damit er groß genug
       für ein Feld von nmemb Elementen mit jeweils Größe Byte ist. Sie ist äquivalent zu dem Aufruf:

               realloc(ptr, nmemb * Größe);

       Allerdings schlägt reallocarray(), anders  als  obiger  Aufruf  von  realloc(),  sicher  fehl,  wenn  die
       Multiplikation überliefe. Falls solch ein Überlauf auftritt, liefert reallocarray() NULL, setzt errno auf
       ENOMEM und lässt den ursprünglichen Speicherblock unverändert.

RÜCKGABEWERT

       Die Funktionen malloc() und calloc() liefern einen Zeiger auf den reservierten Speicher, der geeignet für
       jeden  eingebauten  Typ  ausgerichtet ist. Tritt ein Fehler auf, geben diese Funktionen NULL zurück. NULL
       kann auch durch einen erfolgreichen Aufruf von malloc()  mit  einer  Größe  von  Null  oder  durch  einen
       erfolgreichen Aufruf von calloc() mit nmemb oder Größe gleich Null zurückgegeben werden.

       Die Funktion free() gibt keinen Wert zurück.

       Die  Funktion  realloc()  gibt  einen  Zeiger  auf  den  neu  belegten Speicher zurück, welcher für jeden
       eingebauten Typ passend ausgerichtet ist oder NULL, falls die Anfrage  fehlschlug.  Der  zurückgelieferte
       Zeiger  kann  zu  ptr  identisch  sein,  falls die Belegung nicht verschoben wurde (z.B. weil genug Platz
       vorhanden war, um die Belegung am Ort selbst zu vergrößern) oder sich von ptr  unterscheiden,  falls  die
       Belegung an eine neue Adresse verschoben wurde. Falls Größe gleich 0 war, wird entweder NULL oder ein für
       die  Übergabe  an  free()  geeigneter  Zeiger  zurückgegeben.  Wenn  realloc()  scheitert,   bleibt   der
       ursprüngliche Block unverändert - er wird nicht freigegeben oder verändert.

       Im  Erfolgsfall  liefert  die  Funktion reallocarray() einen Zeiger auf den neu belegten Speicher zurück.
       Beim Fehlschlag liefert sie NULL und der ursprüngliche Speicherblock bleibt unverändert.

FEHLER

       calloc(), malloc(), realloc() und reallocarray() können mit den folgenden Fehlern fehlschlagen:

       ENOMEM Speicher erschöpft. Möglicherweise erreichte die Anwendung die in getrlimit(2) beschriebene Grenze
              RLIMIT_AS oder RLIMIT_DATA.

VERSIONEN

       reallocarray() kam erstmals in Glibc 2.26 vor.

ATTRIBUTE

       Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.

       ┌─────────────────────┬───────────────────────┬─────────┐
       │SchnittstelleAttributWert    │
       ├─────────────────────┼───────────────────────┼─────────┤
       │malloc(), free(),    │ Multithread-Fähigkeit │ MT-Safe │
       │calloc(), realloc()  │                       │         │
       └─────────────────────┴───────────────────────┴─────────┘

KONFORM ZU

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

       reallocarray()  ist  eine nicht standardisierte Erweiterung, die erstmals in OpenBSD 5.6 und FreeBSD 11.0
       erschien.

ANMERKUNGEN

       Standardmäßig verfolgt Linux eine optimistische Strategie bei der Speicherzuweisung. Das bedeutet  nicht,
       dass  der  Speicher  garantiert  verfügbar  ist, wenn malloc() einen von NULL verschiedenen Zeiger zurück
       gibt. Falls es sich herausstellt, dass das System über keinen freien Speicher verfügt,  werden  ein  oder
       mehrere   Prozesse  vom  OOM-Killer  getötet.  Für  weitere  Informationen  siehe  die  Beschreibung  von
       /proc/sys/vm/overcommit_memory und /proc/sys/vm/oom_adj  in  proc(5)  sowie  die  Linux-Kernel-Quelldatei
       Documentation/vm/overcommit-accounting.rst.

       Normalerweise  stellt  malloc() Speicher auf dem Heap bereit und passt je nach Bedarf die Größe des Heaps
       mittels sbrk(2) an. Bei der Zuweisung von Speicherblöcken größer als MMAP_THRESHOLD Bytes reserviert  die
       Glibc-Implementierung  von  malloc() mithilfe von mmap(2) den Speicher als ein privates anonymes Mapping.
       MMAP_THRESHOLD ist standardmäßig 128 kB, kann aber mittels mallopt(3) angepasst  werden.  Vor  Linux  4.7
       waren  Reservierungen  unter  Verwendung  von  mmap(2)  von  der Ressourcenbeschränkung RLIMIT_DATA nicht
       betroffen; seit Linux 4.7 wird diese Beschränkung auch bei Reservierungen mittels mmap(2) durchgesetzt.

       Um  Verfälschungen  in  Multithread-Anwendungen  zu  vermeiden,  werden  intern  Mutexe  zum  Schutz  der
       Speicherverwaltungs-Datenstrukturen  eingesetzt,  die  von  diesen  Funktionen  genutzt  werden. In einer
       Multithread-Anwendung,  in  denen  Threads  gleichzeitig  Speicher  zuweisen  und  freigeben,  könnte  es
       Zugangskonflikte  für  diese Mutexe geben. Um die Speicherzuweisung in Multithread-Anwendungen skalierbar
       zu bewältigen, erzeugt Glibc zusätzliche memory allocation arenas, wenn  Mutex-Konflikte  entdeckt  wird.
       Jede  Arena ist eine große Speicherregion, die intern vom System (mit brk(2) oder mmap(2)) zugeordnet und
       mit eigenen Mutexen verwaltet wird.

       SUSv2 fordert von malloc(), calloc() und realloc() im Fehlerfall errno auf ENOMEM zu setzen.  Glibc  geht
       davon  aus,  dass das getan wurde (und die Glibc-Versionen dieser Routinen tun es). Wenn Sie eine private
       Implementierung von malloc verwenden, die errno nicht setzt, können  bestimmte  Bibliotheksroutinen  ohne
       einen Grund in errno fehlschlagen.

       Abstürze  in  malloc(),  calloc(),  realloc()  oder  free()  haben  nahezu  immer  einen  Bezug  zu einem
       beschädigten Heap, wie z.B. eine Nutzung von mehr als dem zugeordneten  Bereich  (overflowing)  oder  die
       doppelte Freigabe eines Zeigers.

       Die   malloc()-Implementierung  kann  über  Umgebungsvariablen  eingestellt  werden.  Für  Details  siehe
       mallopt(3).

SIEHE AUCH

       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)

       Für Details über die GNU-C-Bibliotheksimplementierung, siehe
       ⟨https://sourceware.org/glibc/wiki/MallocInternals⟩.

KOLOPHON

       Diese Seite ist Teil der Veröffentlichung 5.10 des Projekts Linux-man-pages. Eine Beschreibung des
       Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden
       sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer
       <Martin.E.Schauer@gmx.de>, Mario Blättermann <mario.blaettermann@gmail.com> und Helge Kreutzmann
       <debian@helgefjell.de> erstellt.

       Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE
       HAFTUNG übernommen.

       Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die
       Mailingliste der Übersetzer ⟨debian-l10n-german@lists.debian.org⟩.