realloc

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(),    │ 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)