Provided by: manpages-pl-dev_0.7-1_all 

NAZWA
malloc, free, calloc, realloc - przydziela i zwalnia pamięć dynamiczną
SKŁADNIA
#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);
OPIS
Funkcja malloc() przydziela pamięć o rozmiarze size bajtów i zwraca wskaźnik do przydzielonej pamięci.
Pamięć nie jest inicjowana. Jeśli size wynosi 0, to malloc() zwraca albo NULL, albo unikatową wartość
wskaźnika, który potem można z powodzeniem przekazać do free().
Funkcja free() zwalnia obszar pamięci wskazywany przez ptr, który został wcześniej przydzielony za pomocą
wywołania malloc(), calloc() lub realloc(). W przeciwnym przypadku lub gdy free(ptr) zostało już
wcześniej wywołane, funkcja zachowa się w sposób nieokreślony. Jeśli ptr jest równe NULL, nie zostanie
wykonana żadna operacja.
Funkcja calloc() przydziela pamięć dla tablicy zawierającej nmemb elementów, każdy o rozmiarze size
bajtów i zwraca wskaźnik do przydzielonej pamięci. Pamięć jest zerowana. Jeśli nmemb lub size wynosi 0,
to calloc() zwraca albo NULL, albo unikatową wartość wskaźnika, który potem można z powodzeniem
przekazać do free().
Funkcja realloc() zmienia rozmiar bloku pamięci wskazywanego przez ptr na size bajtów. Zawartość 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ęć nie zostanie zainicjowana. Jeśli ptr jest równe NULL,
to wywołanie jest równoważne malloc(size) dla wszystkich wartości size; jeśli size jest równe zeru i ptr
jest różny od NULL, to wywołanie jest równoważne z free(ptr). Jeżeli ptr jest różne od NULL, to musi on
pochodzić z wcześniejszego wywołania malloc(), calloc() lub realloc(). Jeśli wskazywany obszar został
przemieszczony, to wykonywane jest free(ptr).
WARTOŚĆ ZWRACANA
Funkcje malloc() i calloc() zwracają wskaźnik do przydzielonej pamięci, który jest odpowiednio wyrównany
dla dowolnego typu wbudowanego. W razie błędu obie funkcje zwracają NULL. NULL może być także zwrócony
przez pomyślne wywołanie malloc() z argumentem size równym zero lub przez pomyślne wywołanie calloc() z
argumentem nmemb lub size równym zero.
Funkcja free() nie zwraca żadnej wartości.
Funkcja realloc() zwraca wskaźnik do nowo przydzielonej pamięci, który jest właściwie wyrównany dla
dowolnego typu wbudowanego i może być różny od ptr lub równy NULL, gdy żądanie zakończy się
niepowodzeniem. Jeśli rozmiar był równy 0, zwracane jest albo NULL, albo wskaźnik odpowiedni do
przekazania go funkcji free(). Gdy realloc() zakończy się niepowodzeniem, pierwotny blok zostaje
nienaruszony - nie jest on ani zwalniany ani przesuwany.
BŁĘDY
calloc(), malloc() i realloc() mogą zawieść z następującym błędem:
ENOMEM Brak wolnej pamięci. Prawdopodobnie aplikację dotknął limit RLIMIT_AS lub RLIMIT_DATA opisany w
getrlimit(2).
ATRYBUTY
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).
┌──────────────────────┬────────────────────────┬─────────┐
│ Interfejs │ Atrybut │ Wartość │
├──────────────────────┼────────────────────────┼─────────┤
│ malloc(), free(), │ Bezpieczeństwo wątkowe │ MT-Safe │
│ calloc(), realloc() │ │ │
└──────────────────────┴────────────────────────┴─────────┘
ZGODNE Z
POSIX.1-2001, POSIX.1-2008, C89, C99.
UWAGI
Linux stosuje optymistyczną strategię przydzielania pamięci. Oznacza to, że gdy malloc() 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 /proc/sys/vm/overcommit_memory i /proc/sys/vm/oom_adj w proc(5) oraz plik
Documentation/vm/overcommit-accounting w źródłach jądra Linuksa.
Zwykle malloc() przydziela pamięć ze sterty i ustawie wymagany rozmiar sterty, używając sbrk(2). Podczas
przydzielania bloków pamięci większych niż MMAP_THRESHOLD bajtów, implementacja malloc() w glibc używa
prywatnych anonimowych map z mmap(2). MMAP_THRESHOLD domyślnie wynosi 128 kB, ale można to zmienić za
pomocą mallopt(3). Limit zasobów RLIMIT_DATA (patrz getrlimit(2)) nie ma zastosowania do pamięci
przydzielonej przy użyciu mmap(2).
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 areny
przydziału pamięci, jeśli wykryte zostanie oczekiwanie na mutex. Każda arena jest dużym regionem pamięci
wewnętrznie zaalokowanym przez system (za pomocą brk(2) lub mmap(2)) i jest zarządzana przy użyciu jej
własnych muteksów.
SUSv2 wymaga, by malloc(), calloc() i realloc() przy wystąpieniu błędu nadawały zmiennej errno wartość
ENOMEM. Glibc zakłada, że tak się dzieje (a wersje tych funkcji zawarte w glibc rzeczywiście to robią).
Jeśli wykorzystuje się własną implementację malloc, która nie ustawia errno, to pewne funkcje
biblioteczne mogą zawieść bez przekazania przyczyny w errno.
Załamania się w malloc(), free(), realloc() lub free są niemal zawsze związane z uszkodzeniami sterty,
takimi jak przekroczenie rozmiaru przydzielonego fragmentu lub dwukrotne zwolnienie tego samego
wskaźnika.
Implementację malloc() można dostosowywać za pomocą zmiennych środowiskowych. Szczegóły opisano w
mallopt(3).
ZOBACZ TAKŻE
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)
O STRONIE
Angielska wersja tej strony pochodzi z wydania 4.07 projektu Linux man-pages. Opis projektu, informacje
dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem
https://www.kernel.org/doc/man-pages/.
TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Andrzej Krzysztofowicz (PTM)
<ankry@mif.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>.
Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie
http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 4.07 oryginału.
GNU 2015-08-08 MALLOC(3)