Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Memóriát foglal le a veremen. Ez a függvény elavult, mert biztonságosabb verzió érhető el; lásd: _malloca.
Szemantika
void *_alloca(
size_t size
);
Paraméterek
size
A veremből lefoglalandó bájtok.
Visszaadott érték
A _alloca rutin egy mutatót void ad vissza a lefoglalt területhez, amely megfelelően igazodik bármilyen típusú objektum tárolásához. Ha size 0, nulla hosszúságú elemet foglal le, _alloca és érvényes mutatót ad vissza az adott elemhez.
A rendszer egy verem túlcsordulási kivételt hoz létre, ha a terület nem foglalható le. A verem túlcsordulási kivétele nem C++ kivétel; ez egy strukturált kivétel. A C++ kivételkezelés helyett strukturált kivételkezelést (SEH) kell használnia.
Megjegyzések
_alloca bájtokat size foglal le a programveremből. A lefoglalt terület automatikusan felszabadul, amikor a hívó függvény kilép (nem akkor, ha a foglalás csak túllépi a hatókört). Ezért ne adja át az argumentumként visszaadott _alloca mutatóértéket a következőnek free:
A kivételkezelő (EH) kifejezett meghívására _alloca korlátozások vonatkoznak. Az x86-osztályú processzorokon futó EH-rutinok a saját memóriakeretükben működnek: Olyan memóriatérben végzik el a feladataikat, amelyek nem a beágyazási függvény veremmutatójának aktuális helye alapján vannak. A leggyakoribb implementációk közé tartoznak a Windows strukturált kivételkezelés (SEH) és a C++ fogási záradék kifejezései. Ezért az alábbi forgatókönyvek bármelyikének explicit meghívása _alloca programhiba-műveletet eredményez a hívási EH-rutinba való visszatérés során:
Windows SEH-kivételszűrő kifejezés:
__except ( _alloca() )A Windows SEH végső kivételkezelője:
__finally { _alloca() }C++ EH catch záradék kifejezés
_alloca Azonban közvetlenül egy EH-rutinból vagy egy alkalmazás által biztosított visszahívásból hívható meg, amelyet a korábban felsorolt EH-forgatókönyvek egyike hív meg.
Fontos
Ha _alloca egy próbablokkon belül van meghívva, a fogási blokkban kell hívnia _resetstkoflw .
A fenti korlátozások mellett a /clr (Common Language Runtime Compilation) beállítás _alloca használata esetén nem használható blokkokban __except . További információ: /clr Korlátozások.
Requirements
| Rutin | Kötelező fejléc |
|---|---|
_alloca |
<malloc.h> |
Example
// crt_alloca.c
// This program demonstrates the use of
// _alloca and trapping any exceptions
// that may occur.
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
int main()
{
int size = 1000;
int errcode = 0;
void *pData = NULL;
// Note: Do not use try/catch for _alloca,
// use __try/__except, since _alloca throws
// Structured Exceptions, not C++ exceptions.
__try {
// An unbounded _alloca can easily result in a
// stack overflow.
// Checking for a size < 1024 bytes is recommended.
if (size > 0 && size < 1024)
{
pData = _alloca( size );
printf_s( "Allocated %d bytes of stack at 0x%p",
size, pData);
}
else
{
printf_s("Tried to allocate too many bytes.\n");
}
}
// If an exception occurred with the _alloca function
__except( GetExceptionCode() == STATUS_STACK_OVERFLOW )
{
printf_s("_alloca failed!\n");
// If the stack overflows, use this function to restore.
errcode = _resetstkoflw();
if (errcode == 0) // _resetstkoflw() returns 0 on failure
{
printf_s("Could not reset the stack!\n");
_exit(1);
}
};
}
Allocated 1000 bytes of stack at 0x0012FB50
Lásd még
Memóriafoglalás
calloc
malloc
realloc
_resetstkoflw
_malloca