.\" -*- coding: UTF-8 -*-
'\" t
.\" Copyright, the authors of the Linux man-pages project
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\" 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 "21 września 2025 r." "Linux man\-pages 6.16" 
.SH NAZWA
malloc, free, calloc, realloc, reallocarray \- przydziela i zwalnia pamięć
dynamiczną
.SH BIBLIOTEKA
Standardowa biblioteka C (\fIlibc\fP,\ \fI\-lc\fP)
.SH SKŁADNIA
.nf
\fB#include <stdlib.h>\fP
.P
\fBvoid *malloc(size_t \fP\fIsize\fP\fB);\fP
\fBvoid free(void *_Nullable \fP\fIp\fP\fB);\fP
\fBvoid *calloc(size_t \fP\fIn\fP\fB, size_t \fP\fIsize\fP\fB);\fP
\fBvoid *realloc(void *_Nullable \fP\fIp\fP\fB, size_t \fP\fIsize\fP\fB);\fP
\fBvoid *reallocarray(void *_Nullable \fP\fIp\fP\fB, size_t \fP\fIn\fP\fB, size_t \fP\fIsize\fP\fB);\fP
.fi
.P
.RS -4
Wymagane ustawienia makr biblioteki glibc (patrz \fBfeature_test_macros\fP(7)):
.RE
.P
\fBreallocarray\fP():
.nf
    Od glibc 2.29:
        _DEFAULT_SOURCE
    glibc 2.28 i wcześniejsze:
        _GNU_SOURCE
.fi
.SH OPIS
.SS malloc()
Funkcja \fBmalloc\fP() przydziela pamięć o rozmiarze \fIsize\fP bajtów i zwraca
wskaźnik do przydzielonej pamięci. \fIPamięć nie jest inicjowana\fP. Jeśli
\fIsize\fP wynosi 0, to \fBmalloc\fP() zwraca unikatową wartość wskaźnika, który
potem można z powodzeniem przekazać do \fBfree\fP() (zob. \[Bq]Nieprzenośne
zachowanie\[rq]).
.SS free()
Funkcja \fBfree\fP() zwalnia obszar pamięci wskazywany przez \fIp\fP, który został
wcześniej przydzielony za pomocą wywołania \fBmalloc\fP() lub funkcji
powiązanych. W przeciwnym przypadku lub gdy \fIp\fP zostało już uwolnione,
funkcja zachowa się w sposób nieokreślony. Jeśli \fIp\fP jest równe NULL, nie
zostanie wykonana żadna operacja.
.SS calloc()
Funkcja \fBcalloc\fP() przydziela pamięć dla tablicy o liczbie \fIn\fP elementów o
rozmiarze \fIsize\fP bajtów każdy i zwraca wskaźnik do przydzielonej
pamięci. Pamięć jest ustawiana na zero. Jeśli \fIn\fP lub \fIsize\fP wynosi 0, to
\fBcalloc\fP() zwraca unikatową wartość wskaźnika, którą potem można z
powodzeniem przekazać do \fBfree\fP().
.P
Jeśli przemnożenie \fIn\fP i \fIsize\fP spowodowałoby przepełnienie liczby
całkowitej, \fIcalloc\fP() zwróci błąd. Przepełnienie nie zostałoby natomiast
wykryte w następującym wywołaniu do \fBmalloc\fP(), które spowodowałoby
przydzielenie bloku pamięci o nieprawidłowym rozmiarze:
.P
.in +4n
.EX
malloc(n * size);
.EE
.in
.SS realloc()
Funkcja \fBrealloc\fP() zmienia rozmiar bloku pamięci wskazywanego przez \fIp\fP
na \fIsize\fP bajtów. Zawartość pamięci nie zostanie zmieniona w zakresie od
początku obszaru do minimum ze starego i nowego rozmiaru. Jeśli nowy rozmiar
jest większy od starego, to dodana pamięć \fInie\fP zostanie zainicjowana.
.P
Jeśli \fIp\fP jest równe NULL, to wywołanie jest równoważne \fImalloc(size)\fP dla
wszystkich wartości \fIsize\fP.
.P
jeśli \fIsize\fP jest równe zeru i \fIp\fP jest różny od NULL, to wywołanie jest
równoważne z \fIfree(p)\fP (lecz zob. \[Bq]Nieprzenośne zachowanie\[rq] w
sprawie problemów z przenośnością).
.P
Jeżeli \fIp\fP jest różne od NULL, to musi on pochodzić z wcześniejszego
wywołania \fBmalloc\fP() lub powiązanych funkcji. Jeśli wskazywany obszar
został przemieszczony, to wykonywane jest \fIfree(p)\fP.
.SS reallocarray()
Funkcja \fBreallocarray\fP() zmieni rozmiar (i ewentualnie przesunie) blok
pamięci, na który wskazuje \fIp\fP, do wielkości odpowiednio dużej dla tablicy
\fIn\fP elementów, każdy z których ma rozmiar \fIsize\fP bajtów. Jest to
równoważne wywołaniu
.P
.in +4n
.EX
realloc(p, n * size);
.EE
.in
.P
Jednak w odróżnieniu od tego wywołania \fBrealloc\fP(), \fBreallocarray\fP()
bezpiecznie zawiedzie w przypadku, w którym mnożenie prowadziłoby do
przepełnienia. Jeśli takie przepełnienie wystąpi, \fBreallocarray\fP() zwróci
błąd.
.SH "WARTOŚĆ ZWRACANA"
Funkcje \fBmalloc\fP(), \fBcalloc\fP(), \fBrealloc\fP() i \fBreallocarray\fP() zwracają
wskaźnik do przydzielonej pamięci, który jest odpowiednio wyrównany dla
dowolnego typu, który mieści się w żądanym lub mniejszym rozmiarze. W razie
błędu funkcje te zwracają NULL i ustawiają \fIerrno\fP. Próba przydzielenia
więcej niż \fBPTRDIFF_MAX\fP bajtów jest uważana za błąd, ponieważ tak duże
obiekty mogą później spowodować przepełnienie przy odjęciu wskaźnika.
.P
Funkcja \fBfree\fP() nie zwraca żadnej wartości i zachowuje \fIerrno\fP.
.P
Funkcje \fBrealloc\fP() i \fBreallocarray\fP() zwracają NULL jeśli \fIp\fP nie wynosi
NULL, a żądany rozmiar wynosi zero; nie jest to uważane za błąd (problemy z
przenośnością opisano w rozdziale \[Bq]Nieprzenośne zachowanie\[rq]). W
innym przypadku, żądany wskaźnik może być taki sam jak \fIp\fP, jeśli alokacja
nie została przesunięta (np. było miejsce na poszerzenie alokacji w miejscu)
lub inny od \fIp\fP, jeśli alokację przeniesiono pod nowy adres. Jeśli funkcje
te zawiodą, pierwotny blok pozostaje nienaruszony; nie jest zwalniany ani
przesuwany.
.SH BŁĘDY
\fBcalloc\fP(), \fBmalloc\fP(), \fBrealloc\fP() i \fBreallocarray\fP() mogą zawieść z
następującym błędem:
.TP 
\fBENOMEM\fP
Brak wolnej pamięci. Prawdopodobnie aplikację dotknął limit \fBRLIMIT_AS\fP lub
\fBRLIMIT_DATA\fP opisany w \fBgetrlimit\fP(2). Innym powodem, może być
przekroczenie liczby mapowań określonej w \fI/proc/sys/vm/max_map_count\fP
przez proces wywołujący.
.SH ATRYBUTY
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku
\fBattributes\fP(7).
.TS
allbox;
lbx lb lb
l l l.
Interfejs	Atrybut	Wartość
T{
.na
.nh
\fBmalloc\fP(),
\fBfree\fP(),
\fBcalloc\fP(),
\fBrealloc\fP()
T}	Bezpieczeństwo wątkowe	MT\-bezpieczne
.TE
.SH STANDARDY
.TP 
\fBmalloc\fP()
.TQ
\fBfree\fP()
.TQ
\fBcalloc\fP()
.TQ
\fBrealloc\fP()
C23, POSIX.1\-2024.
.TP 
\fBreallocarray\fP()
POSIX.1\-2024.
.SS "realloc(p, 0)"
Zachowanie \fIrealloc(p,\ 0)\fP nie jest zgodne z C99, C11, POSIX.1\-2001,
POSIX.1\-2004, POSIX.1\-2008, POSIX.1\-2013, POSIX.1\-2017 ani
POSIX.1\-2024. Normę C17 zmieniono tak, aby stało się zgodne, lecz podany w
niej sposób czyni niemożliwym napisanie takiego kodu, który zawsze jest w
stanie ustalić, czy wskaźnik wejściowy jest zwalniany po \fIrealloc(p,\ 0)\fP;
z tego powodu w C23 stało się to ponownie zachowaniem niezdefiniowanym,
przyjmując do wiadomości, że norma C17 była na tyle ogólna, że przewidziane
zachowanie niezdefiniowane nie jest wcale gorszym rozwiązaniem.
.P
\fBreallocarray\fP() ma te same problemy w glibc.
.P
libc musl i systemy BSD są zgodne ze wszystkimi wersjami ISO C i POSIX.1.
.P
gnulib zapewnia moduł \fIrealloc\-posix\fP, który dostarcza opakowania
\fBrealloc\fP() i \fBreallocarray\fP(), które są zgodne ze wszystkimi wersjami ISO
C i POSIX.1.
.P
Zaproponowano zestandaryzowanie zachowania BSD:
.UR https://www.open\-std.org/\:jtc1/\:sc22/\:wg14/\:www/\:docs/\:n3621.txt
.UE .
.SH HISTORIA
.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.
.P
Od glibc 2.30, \fBmalloc\fP() i powiązane funkcje odmówią rozmiarów większych
od \fBPTRDIFF_MAX\fP.
.P
\fBfree\fP() zachowuje \fIerrno\fP zaczynając od glibc 2.33.
.SS realloc(p,\ 0)
C89 było niejednoznaczne w określeniu \fIrealloc(p,\ 0)\fP. C99 częściowo to
poprawiło.
.P
Pierwotna implementacja w glibc byłaby zgodna z C99. Jednak, jak na ironię,
próbując zachować zgodność z C99 jeszcze przed wydaniem standardu, glibc
zmieniło swoje zachowanie w wersji glibc 2.1.1 na to, co ostatecznie stało
się niezgodne z końcową wersją normy C99 (lecz jest to dyskusyjne, bowiem
sformułowanie standardu wygląda na wewnętrznie sprzeczne).
.SH UWAGI
Linux stosuje optymistyczną strategię przydzielania pamięci. Oznacza to, że
gdy \fBmalloc\fP() zwraca wartość różną od NULL, nie ma gwarancji, iż pamięć
faktycznie jest dostępna. Jeśli okaże się, że systemowi brakło pamięci,
niesławny zabójca OOM ("out\-of\-memory killer") zabije jeden lub więcej
procesów. Więcej informacji zawiera opis plików
\fI/proc/sys/vm/overcommit_memory\fP i \fI/proc/sys/vm/oom_adj\fP w \fBproc\fP(5)
oraz plik \fIDocumentation/vm/overcommit\-accounting.rst\fP w źródłach jądra
Linuksa.
.P
Zwykle \fBmalloc\fP() przydziela pamięć ze sterty i ustawia wymagany rozmiar
sterty, używając \fBsbrk\fP(2). Podczas przydzielania bloków pamięci większych
niż \fBMMAP_THRESHOLD\fP bajtów, implementacja \fBmalloc\fP() w glibc używa
prywatnych anonimowych map z \fBmmap\fP(2). \fBMMAP_THRESHOLD\fP domyślnie wynosi
128\ kB, ale można to zmienić za pomocą \fBmallopt\fP(3). Przed Linuksem 4.7,
limit zasobów \fBRLIMIT_DATA\fP (patrz \fBgetrlimit\fP(2)) nie miał zastosowania
do pamięci przydzielonej przy użyciu \fBmmap\fP(2); od Linuksa 4.7 limit ten
stosuje się również dla alokacji dokonywanych za pomocą \fBmmap\fP(2).
.P
Aby uniknąć uszkodzenia pamięci w aplikacjach wielowątkowych, funkcje te
wewnętrznie stosują muteksy, chroniące struktury danych odnoszące się do
zarządzania pamięcią. W aplikacji wielowątkowej, w której wątki jednocześnie
przydzielają i zwalniają pamięć mogą występować oczekiwania na dostęp do
muteksów. Aby przydział pamięci w aplikacji wielowątkowej był skalowalny,
biblioteka glibc tworzy dodatkowe \fIareny przydziału pamięci\fP, jeśli wykryte
zostanie oczekiwanie na mutex. Każda arena jest dużym regionem pamięci
wewnętrznie zaalokowanym przez system (za pomocą \fBbrk\fP(2) lub \fBmmap\fP(2)) i
jest zarządzana przy użyciu jej własnych muteksów.
.P
Jeśli dany program używa prywatnego alokatora pamięci, powinien to czynić
przez zastąpienie \fBmalloc\fP(), \fBfree\fP(), \fBcalloc\fP() i
\fBrealloc\fP(). Funkcje zastępujące muszą implementować opisywane zachowania
glibc, w tym obsługę \fIerrno\fP, alokację o zerowym rozmiarze i sprawdzanie
przepełnienia; w innym przypadku inne funkcje biblioteczne mogą się załamać
lub działać niepoprawnie. Na przykład, jeśli zastępcze \fIfree\fP() nie będzie
zachowywać \fIerrno\fP, to pozornie niepowiązane funkcje biblioteczne mogą
zawodzić bez prawidłowej przyczyny w \fIerrno\fP. Prywatne alokatory pamięci
mogą spowodować konieczność zastąpienia również innych funkcji glibc; więcej
szczegółów w rozdziale \[Bq]Replacing malloc\[rq] w podręczniku glibc.
.P
Załamania w alokatorach pamięci są niemal zawsze związane z uszkodzeniami
sterty, takimi jak przekroczenie rozmiaru przydzielonego fragmentu lub
dwukrotne zwolnienie tego samego wskaźnika.
.P
Implementację \fBmalloc\fP() można dostosowywać za pomocą zmiennych
środowiskowych. Szczegóły opisano w \fBmallopt\fP(3).
.SS "Nieprzenośne zachowanie"
Zachowanie tych funkcji, gdy żądany rozmiar wynosi zero, zależy od glibc;
inne implementacje mogą zwrócić NULL bez ustawienia \fIerrno\fP, a przenośne
programy POSIX powinny tolerować takie zachowanie. Zob. \fBrealloc\fP(3p).
.P
POSIX wymaga ustawiania \fIerrno\fP przez alokatory pamięci, przy
niepowodzeniu. Jednak standard C tego nie wymaga, dlatego aplikacje
przenośne na platformy poza POSIX nie powinny zakładać takiego zachowania.
.P
Przenośne programy nie powinny używać prywatnych alokatorów pamięci,
ponieważ POSIX i standard C nie dopuszczają zastępowania \fBmalloc\fP(),
\fBfree\fP(), \fBcalloc\fP() i \fBrealloc\fP().
.SH USTERKI
Programiści mogliby oczekiwać, że \fI\%realloc(p,\ size)\fP jest spójne z
\fIfree(p)\fP i \fImalloc(size)\fP, jako że takie zachowanie występuje w ogólnym
przypadku. Nie jest to wprost wymagane przez POSIX.1\-2024 ani C11, jednak
wszystkie zgodne implementacje są tu spójne.
.P
Implementacja \fBrealloc\fP() w glibc nie jest z tym spójna, dlatego
wywoływanie \fI\%realloc(p,\ 0)\fP jest niebezpieczne w glibc.
.P
Trywialnym obejściem problemu w glibc jest wywołanie w postaci
\fI\%realloc(p,\ size?size:1)\fP.
.P
Obejściem problemu w \fBreallocarray\fP() w glibc, które cierpi na tę samą
usterkę, byłoby \fI\%reallocarray(p,\ n?n:1,\ size?size:1)\fP.
.SH PRZYKŁADY
.EX
#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 n, 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 n, size_t size)
{
    return reallocarray(NULL, n, size);
}
.EE
.SH "ZOBACZ TAKŻE"
.\" 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)
.P
Szczegóły na temat implementacji biblioteki GNU C są dostępne pod adresem
.UR https://sourceware.org/glibc/wiki/MallocInternals
.UE .
.PP
.SH TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika:
Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>,
Robert Luberda <robert@debian.org>
i
Michał Kułach <michal.kulach@gmail.com>
.
.PP
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach
licencji można uzyskać zapoznając się z
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License w wersji 3
.UE
lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
.PP
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy
dyskusyjnej
.MT manpages-pl-list@lists.sourceforge.net
.ME .
