Provided by: manpages-pl-dev_0.6-2_all bug

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.