alloca - przydzielanie pamięci, która jest automatycznie zwalniana
Standardowa biblioteka C (
libc,
-lc)
#include <alloca.h>
void *alloca(size_t rozmiar);
Funkcja
alloca() przydziela
rozmiar bajtów pamięci
na ramce stosu procedury, z której została wywołana. Ta
tymczasowa przestrzeń jest automatycznie zwalniana po powrocie funkcji,
która wywołuje
alloca() do miejsca wywołania.
Funkcja
alloca() zwraca wskaźnik do początku przydzielonej
pamięci. Gdy przydzielenie pamięci spowoduje
przepełnienie stosu, zachowanie programu nie jest określone.
Informacje o pojęciach używanych w tym rozdziale można
znaleźć w podręczniku
attributes(7).
Interfejs |
Atrybut |
Wartość |
alloca() |
Bezpieczeństwo wątkowe |
MT-Safe |
Funkcja nie występuje w POSIX.1.
alloca() originates from PWB and 32V, and appears in all their
derivatives.
The
alloca() function is machine- and compiler-dependent. Because it
allocates from the stack, it's faster than
malloc(3) and
free(3). In certain cases, it can also simplify memory deallocation in
applications that use
longjmp(3) or
siglongjmp(3). Otherwise,
its use is discouraged.
Ponieważ przestrzeń alokowana przez
alloca() jest
przydzielana z przestrzeni stosu, to przestrzeń ta jest automatycznie
zwalniana, jeśli nastąpi przeskoczenie powrotu z funkcji przez
wywołanie
longjmp(3) lub
siglongjmp(3).
The space allocated by
alloca() is
not automatically deallocated
if the pointer that refers to it simply goes out of scope.
Pamięci przydzielonej przez
alloca() nie można
zwalniać za pomocą
free(3)!
By necessity,
alloca() is a compiler built-in, also known as
__builtin_alloca(). By default, modern compilers automatically
translate all uses of
alloca() into the built-in, but this is forbidden
if standards conformance is requested (
-ansi,
-std=c*), in
which case
<alloca.h> is required, lest a symbol dependency be
emitted.
The fact that
alloca() is a built-in means it is impossible to take its
address or to change its behavior by linking with a different library.
Variable length arrays (VLAs) are part of the C99 standard, optional since C11,
and can be used for a similar purpose. However, they do not port to standard
C++, and, being variables, live in their block scope and don't have an
allocator-like interface, making them unfit for implementing functionality
like
strdupa(3).
Due to the nature of the stack, it is impossible to check if the allocation
would overflow the space available, and, hence, neither is indicating an
error. (However, the program is likely to receive a
SIGSEGV signal if
it attempts to access unavailable space.)
W wielu systemach
alloca() nie może być używana w
obrębie listy argumentów w wywołaniu funkcji, gdyż
zarezerwowana przez
alloca() przestrzeń stosu znalazłaby
się w środku przestrzeni stosu przeznaczonej na argumenty
funkcji.
brk(2),
longjmp(3),
malloc(3)
Autorami polskiego tłumaczenia niniejszej strony podręcznika
są: Adam Byrtek <
[email protected]>, Andrzej Krzysztofowicz
<
[email protected]>, Robert Luberda <
[email protected]> i
Michał Kułach <
[email protected]>
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
[email protected]