MALLOC(3)

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

ÜBERSICHT
#include <stdlib.h>

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

BESCHREIBUNG

malloc() belegt size Byte und gibt einen Zeiger auf den belegten Speicherbereich zurück. Der Speicher wird nicht initialisiert. Falls size 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 Array von nmemb Elementen von jeweils size Byte und gibt einen Zeiger auf den belegten Speicherbereich zurück. Der Speicher wird auf Null gesetzt. Falls nmemb oder size 0 ist, gibt calloc() entweder NULL zurück oder einen eindeutigen Zeigerwert, der später erfolgreich an free() übergeben werden kann.

realloc() ändert die Größe des Speicherblocks, auf den ptr zeigt, auf size 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(size); 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.

RÜCKGABEWERT
The malloc() and calloc() functions return a pointer to the allocated memory that is suitably aligned for any kind of variable. On error, these functions return NULL. NULL may also be returned by a successful call to malloc() with a size of zero, or by a successful call to calloc() with nmemb or size equal to zero.

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

The realloc() function returns a pointer to the newly allocated memory, which is suitably aligned for any kind of variable and may be different from ptr, or NULL if the request fails. If size was equal to 0, either NULL or a pointer suitable to be passed to free() is returned. If realloc() fails the original block is left untouched; it is not freed or moved.

KONFORM ZU
C89, C99.

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« beendet. 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.

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() den Speicher als eine private anonyme Zuordnung mithilfe von mmap(2). MMAP_THRESHOLD ist standardmäßig 128 kB, kann aber mittels mallopt(3) angepasst werden. Reservierungen unter Verwendung von mmap(2) sind von der Ressourcenbeschränkung RLIMIT_DATA (siehe getrlimit(2)) nicht betroffen.

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.

Der UNIX-98-Standard 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 fehlschlagen, 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.

Neuere Versionen der Linux-Libc (neuer als 5.4.23) und Glibc (2.x) enthalten eine malloc()-Implementierung, die über Umgebungsvariablen eingestellt werden kann. Für Details siehe mallopt(3).

SIEHE AUCH
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)

KOLOPHON
This page is part of release 3.54 of the Linux man-pages project. A description of the project, and information about reporting bugs, can be found at http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 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 <debian-l10n-german@lists.debian.org>.