focal (3) malloc.3.gz

Provided by: manpages-pl-dev_0.7-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.

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).

       ┌─────────────────────┬────────────────────────┬─────────┐
       │InterfejsAtrybutWartość │
       ├─────────────────────┼────────────────────────┼─────────┤
       │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.