table of contents
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); void *reallocarray(void *ptr, size_t nmemb, size_t size);
Wymagane ustawienia makr biblioteki glibc (patrz
feature_test_macros(7)):
reallocarray():
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.
The calloc() function allocates memory for an array of nmemb elements of size bytes each and returns a pointer to the allocated memory. The memory is set to zero. If nmemb or size is 0, then calloc() returns either NULL, or a unique pointer value that can later be successfully passed to 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).
The reallocarray() function changes the size of the memory block pointed to by ptr to be large enough for an array of nmemb elements, each of which is size bytes. It is equivalent to the call
realloc(ptr, nmemb * size);
However, unlike that realloc() call, reallocarray() fails safely in the case where the multiplication would overflow. If such an overflow occurs, reallocarray() returns NULL, sets errno to ENOMEM, and leaves the original block of memory unchanged.
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.
On success, the reallocarray() function returns a pointer to the newly allocated memory. On failure, it returns NULL and the original block of memory is left untouched.
BŁĘDY¶
calloc(), malloc(), realloc() i reallocarray() 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(), calloc(), realloc() | Bezpieczeństwo wątkowe | MT-Safe |
ZGODNE Z¶
malloc(), free(), calloc(), realloc(): POSIX.1-2001, POSIX.1-2008, C89, C99.
reallocarray() is a nonstandard extension that first appeared in OpenBSD 5.6 and FreeBSD 11.0.
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.
Normally, malloc() allocates memory from the heap, and adjusts the size of the heap as required, using sbrk(2). When allocating blocks of memory larger than MMAP_THRESHOLD bytes, the glibc malloc() implementation allocates the memory as a private anonymous mapping using mmap(2). MMAP_THRESHOLD is 128 kB by default, but is adjustable using mallopt(3). Prior to Linux 4.7 allocations performed using mmap(2) were unaffected by the RLIMIT_DATA resource limit; since Linux 4.7, this limit is also enforced for allocations performed using 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¶
valgrind(1), 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.16 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 są: Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.
15 września 2017 r. | GNU |