Scroll to navigation

MALLOC(3) Podręcznik programisty Linuksa MALLOC(3)

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(), calloc(), realloc() Bezpieczeństwo wątkowe MT-Safe

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.

2015-08-08 GNU