Provided by:
manpages-pl-dev_20060617-1_all 
NAZWA
calloc, malloc, free, realloc - przydziela i zwalnia pamięć dynamiczną
SKŁADNIA
#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);
void *malloc(size_t size);
void free(void *ptr);
void *realloc(void *ptr, size_t size);
OPIS
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.
malloc() przydziela size bajtów i zwraca wskaźnik do przydzielonej
pamięci. Pamięć nie jest czyszczona.
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.
realloc() zmienia rozmiar bloku pamięci wskazywanego przez ptr na size
bajtów. Zawartość nie zostanie zmieniona w zakresie poniżej minimum ze
starego i nowego rozmiaru; nowo przydzielona pamięć nie zostanie
zainicjalizowana. Jeśli ptr jest równe NULL, to wywołanie jest
równoważne malloc(size); jeśli size jest równe zeru, to wywołanie jest
równoważne free(ptr). O ile ptr nie jest równe NULL, musi ono być
zwrócone przez wcześniejsze wywołanie malloc(), calloc() lub realloc().
WARTOŚĆ ZWRACANA
Dla calloc() i malloc(), zwracana wartość jest wskaźnikiem do
przydzielonej pamięci, który jest właściwie wyrównany dla dowolnego
rodzaju zmiennej, lub NULL gdy żądanie zakończyło się niepowodzeniem.
free() nie zwraca żadnej wartości.
realloc() zwraca wskaźnik do nowoprzydzielonej pamięci, który jest
właściwie wyrównany dla dowolnego rodzaju zmiennej i może być różny od
ptr, lub NULL gdy żądanie zakończy się niepowodzeniem. Jeśli rozmiar
był równy 0, zwracane jest NULL lub 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
ANSI-C
ZOBACZ TAKŻE
brk(2), posix_memalign(3)
UWAGI
Standard Unix98 wymaga, by malloc(), calloc() i realloc() przy
wystąpieniu błędu nadawały 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() czy realloc() są niemal zawsze
związane z uszkodzeniami sterty, takimi jak przekroczenia rozmiaru
przydzielonego fragmentu lub dwukrotne zwolnienie tego samego
wskaźnika.
Nowe wersje linuksowej biblioteki libc (późniejsze niż 5.4.23) i GNU
libc (2.x) zawierają implementację malloc, którą można dostrajać za
pośrednictwem zmiennych środowiskowych. Przy ustawionej zmiennej
MALLOC_CHECK_ stosowana jest specjalna (mniej wydajna) implementacja.
Zgodnie z zamierzeniami, powinna być bardziej odporna na proste błędy,
jak podwójne wywołania free() z tym samym argumentem czy przekroczenia
o pojedynczy bajt (błędy off-by-one). Nie chroni jednak przed
wszystkimi tego rodzaju błędami, w wyniku których mogą powstać wycieki
pamięci. Jeśli MALLOC_CHECK_ ma wartość 0, jakiekolwiek wykryte
uszkodzenie sterty zostanie milcząco zignorowane; jeśli ma wartość 1,
na stderr wypisywany będzie komunikat diagnostyczny; jeśli ma wartość
2, to natychmiast zostanie wywołane abort(). Może się to przydać, gdyż
w przeciwnym razie załamanie się mogłoby wystąpić dużo później, a
prawdziwa przyczyna kłopotów byłaby wówczas bardzo trudna do
wyśledzenia.
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 zabije jeden lub więcej procesów.