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.
ZGODNE Z¶
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.
Standard UNIX 98 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 3.71 projektu Linux
man-pages. Opis projektu, informacje dotyczące zgłaszania
błędów, oraz najnowszą wersję
oryginału można znaleźć pod adresem
http://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ą
3.71 oryginału.