.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de) .\" and Copyright 2007, 2012, 2018, Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" Modified Sat Jul 24 19:00:59 1993 by Rik Faith (faith@cs.unc.edu) .\" Clarification concerning realloc, iwj10@cus.cam.ac.uk (Ian Jackson), 950701 .\" Documented MALLOC_CHECK_, Wolfram Gloger (wmglo@dent.med.uni-muenchen.de) .\" 2007-09-15 mtk: added notes on malloc()'s use of sbrk() and mmap(). .\" .\" FIXME . Review http://austingroupbugs.net/view.php?id=374 .\" to see what changes are required on this page. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH malloc 3 "20. Juli 2023" "Linux man\-pages 6.05.01" .SH BEZEICHNUNG malloc, free, calloc, realloc, reallocarray \- dynamischen Speicher belegen und freigeben .SH BIBLIOTHEK Standard\-C\-Bibliothek (\fIlibc\fP, \fI\-lc\fP) .SH ÜBERSICHT .nf \fB#include \fP .PP \fBvoid *malloc(size_t \fP\fIGröße\fP\fB);\fP \fBvoid free(void *_Nullable \fP\fIzeiger\fP\fB);\fP \fBvoid *calloc(size_t \fP\fInmemb\fP\fB, size_t \fP\fIGröße\fP\fB);\fP \fBvoid *realloc(void *_Nullable \fP\fIzeiger\fP\fB, size_t \fP\fIGröße\fP\fB);\fP \fBvoid *reallocarray(void *_Nullable \fP\fIzeiger\fP\fB, size_t \fP\fInmemb\fP\fB, size_t \fP\fIGröße\fP\fB);\fP .fi .PP .RS -4 Mit Glibc erforderliche Feature\-Test\-Makros (siehe \fBfeature_test_macros\fP(7)): .RE .PP \fBreallocarray\fP(): .nf Seit Glibc 2.29: _DEFAULT_SOURCE Glibc 2.28 und älter: _GNU_SOURCE .fi .SH BESCHREIBUNG .SS malloc() Die Funktion \fBmalloc\fP() belegt \fIGröße\fP Byte und gibt einen Zeiger auf den belegten Speicherbereich zurück. \fIDer Speicher wird nicht initialisiert\fP. Falls \fIGröße\fP 0 ist, wird \fBmalloc\fP() einen eindeutigen Zeigerwert zurückgeben, der später erfolgreich an \fBfree\fP() übergeben werden kann. (Siehe »Nichtportables Verhalten« für Portabilitäts\-Probleme.) .SS free() \fBfree\fP() gibt den Speicher frei, auf den \fIzeiger\fP zeigt, welcher von einem früheren Aufruf von \fBmalloc\fP() oder verwandten Funktionen belegt worden sein muss. Andernfalls oder wenn \fIzeiger\fP bereits freigegeben wurde, ist das Verhalten nicht definiert. Wenn \fIzeiger\fP NULL ist, wird keine Operation ausgeführt. .SS calloc() Die Funktion \fBcalloc\fP() belegt Speicher für ein Feld von \fInmemb\fP Elementen der jeweiligen Größe \fIGröße\fP und liefert einen Zeiger auf den belegten Speicher zurück. Der Speicher wird auf 0 gesetzt. Falls \fInmemb\fP oder \fIGröße\fP 0 ist, wird \fBcalloc\fP() einen eindeutigen Zeigerwert zurückgeben, der später erfolgreich an \fBfree\fP() übergeben werden kann. .PP Falls die Multiplikation von \fInmemb\fP und \fIGröße\fP zu einem Ganzzahlüberlauf führen würde, dann liefert \fBcalloc\fP() einen Fehler zurück. Im Gegensatz dazu würde ein Ganzzahlüberlauf in dem nachfolgenden Aufruf von \fBmalloc\fP() nicht erkannt werden, was zu einer Zuweisung eines Speicherblocks mit falscher Größe führen würde: .PP .in +4n .EX malloc(nmemb * Größe); .EE .in .SS realloc() \fBrealloc\fP() ändert die Größe des Speicherblocks, auf den \fIzeiger\fP zeigt, auf \fIGröße\fP Byte. Der Inhalt des Speichers bleibt im Bereich vom Anfang des Speicherbereichs bis zum Minimum von alter und neuer Größe unverändert. Falls die neue Größe die alte überschreitet, wird der zusätzliche Speicher \fInicht\fP initialisiert. .PP Falls \fIzeiger\fP gleich NULL ist, ist der Aufruf äquivalent zu \fImalloc(Größe)\fP. .PP falls die Größe gleich Null und \fIzeiger\fP von NULL verschieden ist, ist der Aufruf äquivalent zu \fIfree(zeiger)\fP (siehe aber »Nichtportables Verhalten« für Portabilitäts\-Probleme.) .PP Wenn \fIzeiger\fP nicht NULL ist, muss er von einem früheren Aufruf von \fBmalloc\fP() oder verwandten Funktionen zurückgegeben worden sein. Falls der Bereich, auf den verwiesen wurde, verschoben wurde, wird \fIfree(zeiger)\fP aufgerufen. .SS reallocarray() Die Funktion \fBreallocarray\fP() ändert die Größe des Speicherblocks, auf den \fIzeiger\fP zeigt, (und verschiebt ihn möglicherweise,) damit er groß genug für ein Feld von \fInmemb\fP Elementen mit jeweils \fIGröße\fP Byte ist. Sie ist äquivalent zu dem Aufruf: .PP .in +4n .EX realloc(zeiger, nmemb * Größe); .EE .in .PP Allerdings schlägt \fBreallocarray\fP(), anders als obiger Aufruf von \fBrealloc\fP(), sicher fehl, wenn die Multiplikation überliefe. Falls solch ein Überlauf auftritt, liefert \fBreallocarray\fP() einen Fehler zurück. .SH RÜCKGABEWERT Die Funktionen \fBmalloc\fP(), \fBcalloc\fP(), \fBrealloc\fP() und \fBreallocarray\fP() liefern einen Zeiger auf den reservierten Speicher, der geeignet für jeden Typ, der in die angeforderte Größe oder weniger passt, ausgerichtet ist. Tritt ein Fehler auf, geben diese Funktionen NULL zurück und setzen \fIerrno\fP. Versuche, mehr als \fBPTRDIFF_MAX\fP byte zu belegen, wird als ein Fehler betrachtet, da ein Objekt dieser Größe bei späterer Zeigersubtraktion zu einem Überlauf führen könnte. .PP Die Funktion \fBfree\fP() gibt keinen Wert zurück und erhält \fIerrno\fP. .PP Die Funktionen \fBrealloc\fP() und \fBreallocarray\fP() liefern NULL zurück, falls \fIzeiger\fP nicht NULL ist und die angeforderte Größe Null ist; dies wird nicht als Fehler betrachtet. (Siehe »Nichtportables Verhalten« für Portabilitäts\-Probleme.) Andernfalls kann der zurückgelieferte Zeiger zu \fIzeiger\fP 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 \fIzeiger\fP unterscheiden, falls die Belegung an eine neue Adresse verschoben wurde. Wenn diese Funktionen scheitern, bleibt der ursprüngliche Block unverändert \- er wird nicht freigegeben oder verschoben. .SH FEHLER \fBcalloc\fP(), \fBmalloc\fP(), \fBrealloc\fP() und \fBreallocarray\fP() können mit den folgenden Fehlern fehlschlagen: .TP \fBENOMEM\fP Speicher erschöpft. Möglicherweise erreichte die Anwendung die in \fBgetrlimit\fP(2) beschriebene Grenze \fBRLIMIT_AS\fP oder \fBRLIMIT_DATA\fP. Ein anderer Grund könnte sein, dass die Anzahl der durch den aufrufenden Prozess erstellten Mappings die durch \fI/proc/sys/vm/max_map_count\fP festgelegte Grenze überschritten hat. .SH ATTRIBUTE Siehe \fBattributes\fP(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke. .TS allbox; lbx lb lb l l l. Schnittstelle Attribut Wert T{ .na .nh \fBmalloc\fP(), \fBfree\fP(), \fBcalloc\fP(), \fBrealloc\fP() T} Multithread\-Fähigkeit MT\-Sicher .TE .sp 1 .SH STANDARDS .TP \fBmalloc\fP() .TQ \fBfree\fP() .TQ \fBcalloc\fP() .TQ \fBrealloc\fP() C11, POSIX.1\-2008. .TP \fBreallocarray\fP() Keine. .SH GESCHICHTE .TP \fBmalloc\fP() .TQ \fBfree\fP() .TQ \fBcalloc\fP() .TQ \fBrealloc\fP() POSIX.1\-2001, C89. .TP \fBreallocarray\fP() Glibc 2.26. OpenBSD 5.6, FreeBSD 11.0. .PP \fBmalloc\fP() und verwandte Funktionen lehnen seit Glibc 2.30 Größen größer als \fBPTRDIFF_MAX\fP ab. .PP Seit Glibc 2.33 erhält \fBfree\fP() \fIerrno\fP. .SH ANMERKUNGEN Standardmäßig verfolgt Linux eine optimistische Strategie bei der Speicherzuweisung. Das bedeutet nicht, dass der Speicher garantiert verfügbar ist, wenn \fBmalloc\fP() 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 \fI/proc/sys/vm/overcommit_memory\fP und \fI/proc/sys/vm/oom_adj\fP in \fBproc\fP(5) sowie die Linux\-Kernel\-Quelldatei \fIDocumentation/vm/overcommit\-accounting.rst\fP. .PP Normalerweise stellt \fBmalloc\fP() Speicher auf dem Heap bereit und passt je nach Bedarf die Größe des Heaps mittels \fBsbrk\fP(2) an. Bei der Zuweisung von Speicherblöcken größer als \fBMMAP_THRESHOLD\fP Bytes reserviert die Glibc\-Implementierung von \fBmalloc\fP() mithilfe von \fBmmap\fP(2) den Speicher als ein privates anonymes Mapping. \fBMMAP_THRESHOLD\fP ist standardmäßig 128\ kB, kann aber mittels \fBmallopt\fP(3) angepasst werden. Vor Linux 4.7 waren Reservierungen unter Verwendung von \fBmmap\fP(2) von der Ressourcenbeschränkung \fBRLIMIT_DATA\fP nicht betroffen; seit Linux 4.7 wird diese Beschränkung auch bei Reservierungen mittels \fBmmap\fP(2) durchgesetzt. .PP 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 \fImemory allocation arenas\fP, wenn Mutex\-Konflikte entdeckt wird. Jede Arena ist eine große Speicherregion, die intern vom System (mit \fBbrk\fP(2) oder \fBmmap\fP(2)) zugeordnet und mit eigenen Mutexen verwaltet wird. .PP Falls Ihr Programm einen privaten Speicher\-Zuordner verwendet, sollte dies so erfolgen, dass \fBmalloc\fP(), \fBfree\fP(), \fBcalloc\fP() und \fBrealloc\fP() ersetzt werden. Die Ersatzfunktionen müssen das dokumentierte Glibc\-Verhalten implementieren, einschließlich der Handhabung von \fIerrno\fP, Belegungen der Größe Null und der Prüfungen auf Überlauf; andernfalls könnten andere Bibliotheksroutinen abstürzen oder falsch funktionieren. Falls der Ersatz für \fIfree\fP() beispielsweise \fIerrno\fP nicht erhält, dann könnten Bibliotheksfunktionen, die scheinbar keinen Bezug dazu haben, fehlschlagen, ohne einen gültigen Grund in \fIerrno\fP anzugeben. Private Speicher\-Zuordner könnten es auch notwendig machen, andere Glibc\-Funktionen zu ersetzen; siehe »Replacing malloc« im Handbuch der Glibc für Details. .PP Abstürze in Speicher\-Zuordner 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. .PP Die \fBmalloc\fP()\-Implementierung kann über Umgebungsvariablen eingestellt werden. Für Details siehe \fBmallopt\fP(3). .SS "Nichtportierbares Verhalten" Das Verhalten dieser Funktionen, wenn die angeforderte Größe Null ist, ist Glibc\-spezifisch; andere Implementierungen könnten NULL zurückliefern ohne \fIerrno\fP zu setzen. Portierbare POSIX\-Programme sollten solches Verhalten zulassen. Siehe \fBrealloc\fP(3p). .PP POSIX verlangt von Speicher\-Zuordnern, dass sie beim Fehlschlag \fIerrno\fP setzten. Allerdings verlangt der C\-Standard dies nicht und Anwendungen, die auf nicht\-POSIX\-Plattformen portierbar sein sollen, sollten dies nicht voraussetzen. .PP Portierbare Programme sollten keine privaten Speicher\-Zuordner verwenden, da POSIX und der C\-Standard keinen Ersatz für \fBmalloc\fP(), \fBfree\fP(), \fBcalloc\fP() und \fBrealloc\fP() erlauben. .SH BEISPIELE .EX #include #include #include #include #include \& #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); } .EE .SH "SIEHE AUCH" .\" http://g.oswego.edu/dl/html/malloc.html .\" A Memory Allocator - by Doug Lea .\" .\" http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html .\" Linux Heap, Contention in free() - David Boreham .\" .\" http://www.citi.umich.edu/projects/linux-scalability/reports/malloc.html .\" malloc() Performance in a Multithreaded Linux Environment - .\" Check Lever, David Boreham .\" .ad l .nh \fBvalgrind\fP(1), \fBbrk\fP(2), \fBmmap\fP(2), \fBalloca\fP(3), \fBmalloc_get_state\fP(3), \fBmalloc_info\fP(3), \fBmalloc_trim\fP(3), \fBmalloc_usable_size\fP(3), \fBmallopt\fP(3), \fBmcheck\fP(3), \fBmtrace\fP(3), \fBposix_memalign\fP(3) .PP Für Details über die GNU\-C\-Bibliotheksimplementierung, siehe .UR https://sourceware.org/glibc/wiki/MallocInternals .UE . .PP .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer , Mario Blättermann und Helge Kreutzmann erstellt. .PP Diese Übersetzung ist Freie Dokumentation; lesen Sie die .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 .UE oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. .PP Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die .MT debian-l10n-german@lists.debian.org Mailingliste der Übersetzer .ME .