Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

       malloc, free, calloc, realloc, reallocarray - przydziela i zwalnia pamięć dynamiczną

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <stdlib.h>

       void *malloc(size_t size);
       void free(void *_Nullable ptr);
       void *calloc(size_t nmemb, size_t size);
       void *realloc(void *_Nullable ptr, size_t size);
       void *reallocarray(void *_Nullable ptr, size_t nmemb, size_t size);

   Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

       reallocarray():
           Od glibc 2.29:
               _DEFAULT_SOURCE
           glibc 2.28 i wcześniejsze:
               _GNU_SOURCE

OPIS

   malloc()
       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 unikatową  wartość  wskaźnika,  który
       potem można z powodzeniem przekazać do free() (zob. „Nieprzenośne zachowanie”).

   free()
       Funkcja free() zwalnia obszar pamięci wskazywany przez ptr, który został wcześniej przydzielony za pomocą
       wywołania  malloc()  lub  funkcji  powiązanych. W przeciwnym przypadku lub gdy ptr zostało już uwolnione,
       funkcja zachowa się w sposób nieokreślony. Jeśli  ptr  jest  równe  NULL,  nie  zostanie  wykonana  żadna
       operacja.

   calloc()
       Funkcja  calloc() przydziela pamięć dla tablicy o liczbie nmemb elementów o rozmiarze size bajtów każdy i
       zwraca wskaźnik do przydzielonej pamięci. Pamięć jest ustawiana na zero. Jeśli nmemb lub size  wynosi  0,
       to calloc() zwraca unikatową wartość wskaźnika, którą potem można z powodzeniem przekazać do free().

       Jeśli  przemnożenie  nmemb  i  size  spowodowałoby przepełnienie liczby całkowitej, calloc() zwróci błąd.
       Przepełnienie nie zostałoby natomiast wykryte w następującym wywołaniu do malloc(),  które  spowodowałoby
       przydzielenie bloku pamięci o nieprawidłowym rozmiarze:

           malloc(nmemb * size);

   realloc()
       Funkcja  realloc() zmienia rozmiar bloku pamięci wskazywanego przez ptr na size bajtów. Zawartość pamięci
       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) (lecz  zob.
       „Nieprzenośne zachowanie” w sprawie problemów z przenośnością).

       Jeżeli  ptr  jest różne od NULL, to musi on pochodzić z wcześniejszego wywołania malloc() lub powiązanych
       funkcji. Jeśli wskazywany obszar został przemieszczony, to wykonywane jest free(ptr).

   reallocarray()
       Funkcja reallocarray() zmieni rozmiar (i ewentualnie przesunie) blok pamięci, na który wskazuje  ptr,  do
       wielkości  odpowiednio dużej dla tablicy nmemb elementów, każdy z których ma rozmiar size bajtów. Jest to
       równoważne wywołaniu

           realloc(ptr, nmemb * size);

       Jednak w odróżnieniu od tego wywołania realloc(), reallocarray() bezpiecznie  zawiedzie  w  przypadku,  w
       którym  mnożenie  prowadziłoby do przepełnienia. Jeśli takie przepełnienie wystąpi, reallocarray() zwróci
       błąd.

WARTOŚĆ ZWRACANA

       Funkcje malloc(), calloc(), realloc() i reallocarray() zwracają wskaźnik do przydzielonej pamięci,  który
       jest  odpowiednio  wyrównany  dla  dowolnego  typu, który mieści się w żądanym lub mniejszym rozmiarze. W
       razie błędu funkcje te zwracają NULL i ustawiają errno. Próba przydzielenia więcej niż PTRDIFF_MAX bajtów
       jest uważana za błąd, ponieważ tak duże  obiekty  mogą  później  spowodować  przepełnienie  przy  odjęciu
       wskaźnika.

       Funkcja free() nie zwraca żadnej wartości i zachowuje errno.

       Funkcje realloc() i reallocarray() zwracają NULL jeśli ptr nie wynosi NULL, a żądany rozmiar wynosi zero;
       nie  jest  to uważane za błąd (problemy z przenośnością opisano w rozdziale „Nieprzenośne zachowanie”). W
       innym przypadku, żądany wskaźnik może być taki sam jak ptr, jeśli alokacja nie została  przesunięta  (np.
       było  miejsce  na  poszerzenie  alokacji w miejscu) lub inny od ptr, jeśli alokację przeniesiono pod nowy
       adres. Jeśli  funkcje  te  zawiodą,  pierwotny  blok  pozostaje  nienaruszony;  nie  jest  zwalniany  ani
       przesuwany.

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).   Innym   powodem,   może   być   przekroczenie   liczby   mapowań   określonej    w
              /proc/sys/vm/max_map_count przez proces wywołujący.

ATRYBUTY

       Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).
       ┌──────────────────────────────────────────────────────────────┬────────────────────────┬───────────────┐
       │ InterfejsAtrybutWartość       │
       ├──────────────────────────────────────────────────────────────┼────────────────────────┼───────────────┤
       │ malloc(), free(), calloc(), realloc()                        │ Bezpieczeństwo wątkowe │ MT-bezpieczne │
       └──────────────────────────────────────────────────────────────┴────────────────────────┴───────────────┘

STANDARDY

       malloc()
       free()
       calloc()
       realloc()
              C11, POSIX.1-2008.

       reallocarray()
              Brak.

HISTORIA

       malloc()
       free()
       calloc()
       realloc()
              POSIX.1-2001, C89.

       reallocarray()
              glibc 2.26. OpenBSD 5.6, FreeBSD 11.0.

       Od glibc 2.30, malloc() i powiązane funkcje odmówią rozmiarów większych od PTRDIFF_MAX.

       free() zachowuje errno zaczynając od glibc 2.33.

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.rst w źródłach jądra Linuksa.

       Zwykle malloc() przydziela pamięć ze sterty i ustawia 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).  Przed  Linuksem  4.7,  limit  zasobów  RLIMIT_DATA  (patrz  getrlimit(2))  nie  miał
       zastosowania do pamięci przydzielonej przy użyciu mmap(2); od Linuksa 4.7 limit ten stosuje  się  również
       dla alokacji dokonywanych za pomocą 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.

       Jeśli dany program używa prywatnego alokatora pamięci, powinien to  czynić  przez  zastąpienie  malloc(),
       free(),  calloc()  i realloc(). Funkcje zastępujące muszą implementować opisywane zachowania glibc, w tym
       obsługę errno, alokację o zerowym rozmiarze i sprawdzanie przepełnienia; w innym przypadku  inne  funkcje
       biblioteczne  mogą  się  załamać lub działać niepoprawnie. Na przykład, jeśli zastępcze free() nie będzie
       zachowywać errno, to pozornie niepowiązane funkcje biblioteczne mogą zawodzić bez prawidłowej przyczyny w
       errno. Prywatne alokatory pamięci mogą spowodować konieczność zastąpienia również innych  funkcji  glibc;
       więcej szczegółów w rozdziale „Replacing malloc” w podręczniku glibc.

       Załamania   w  alokatorach  pamięci  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).

   Nieprzenośne zachowanie
       Zachowanie tych funkcji, gdy żądany rozmiar wynosi zero, zależy od glibc; inne implementacje mogą zwrócić
       NULL  bez  ustawienia  errno,  a  przenośne  programy  POSIX  powinny  tolerować  takie  zachowanie. Zob.
       realloc(3p).

       POSIX wymaga ustawiania errno przez alokatory pamięci, przy niepowodzeniu. Jednak  standard  C  tego  nie
       wymaga, dlatego aplikacje przenośne na platformy poza POSIX nie powinny zakładać takiego zachowania.

       Przenośne  programy  nie  powinny  używać  prywatnych alokatorów pamięci, ponieważ POSIX i standard C nie
       dopuszczają zastępowania malloc(), free(), calloc() i realloc().

PRZYKŁADY

       #include <err.h>
       #include <stddef.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>

       #define MALLOCARRAY(n, type)  ((type *) my_mallocarray(n, sizeof(type)))
       #define MALLOC(type)          MALLOCARRAY(1, type)

       static inline void *my_mallocarray(size_t nmemb, size_t size);

       int
       main(void)
       {
           char  *p;

           p = MALLOCARRAY(32, char);
           if (p == NULL)
               err(EXIT_FAILURE, "malloc");

           strlcpy(p, "foo", 32);
           puts(p);
       }

       static inline void *
       my_mallocarray(size_t nmemb, size_t size)
       {
           return reallocarray(NULL, nmemb, size);
       }

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)

       Szczegóły na temat implementacji biblioteki GNU C są dostępne pod adresem
       https://sourceware.org/glibc/wiki/MallocInternals.

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.

Linux man-pages 6.8                              2 maja 2024 r.                                        malloc(3)