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¶
Die Funktionen
malloc() und
calloc() liefern einen Zeiger auf den
reservierten Speicher, der geeignet für alle Arten von Variablen
ausgerichtet ist. Tritt ein Fehler auf, geben diese Funktionen NULL
zurück. NULL kann auch durch einen erfolgreichen Aufruf von
malloc() mit einer
size von Null oder durch einen erfolgreichen
Aufruf von
calloc() mit
nmemb oder
size 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 alle Arten von Variablen passend ausgerichtet
ist und sich von
ptr unterscheiden kann, oder NULL falls die
Anforderung scheitert. Falls
size 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.
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 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¶
Diese Seite ist Teil der Veröffentlichung 3.42 des Projekts Linux-
man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler
gemeldet werden können, finden sich unter
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>.