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¶
Uwaga! To tłumaczenie może być nieaktualne!
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.
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu
Tłumaczenia Manuali i
może nie być aktualne. W razie
zauważenia różnic między powyższym opisem a
rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o
zapoznanie się z oryginalną (angielską) wersją strony
podręcznika za pomocą polecenia:
- man --locale=C 3 malloc
Prosimy o pomoc w aktualizacji stron man - więcej informacji można
znaleźć pod adresem
http://sourceforge.net/projects/manpages-pl/.