_alloca
Alloca memoria nello stack. Questa funzione è deprecata perché è disponibile una versione più sicura; vedere _malloca
.
Sintassi
void *_alloca(
size_t size
);
Parametri
size
Byte da allocare dallo stack.
Valore restituito
La _alloca
routine restituisce un void
puntatore allo spazio allocato, allineato in modo adeguato per l'archiviazione di qualsiasi tipo di oggetto. Se size
è 0, _alloca
alloca un elemento di lunghezza zero e restituisce un puntatore valido a tale elemento.
Se lo spazio non può essere allocato, viene generata un'eccezione di overflow dello stack. L'eccezione di overflow dello stack non è un'eccezione C++. si tratta di un'eccezione strutturata. Invece di usare la gestione delle eccezioni C++, è necessario usare la gestione delle eccezioni strutturata (SEH).
Osservazioni:
_alloca
size
alloca byte dallo stack di programmi. Lo spazio allocato viene liberato automaticamente quando la funzione chiamante viene chiusa (non quando l'allocazione supera semplicemente l'ambito). Pertanto, non passare il valore del puntatore restituito da _alloca
come argomento a free
.
Esistono restrizioni per chiamare in modo esplicito _alloca
in un gestore di eccezioni (EH). Le routine EH eseguite su processori di classe x86 operano nel proprio frame di memoria: eseguono le attività nello spazio di memoria che non si basa sulla posizione corrente del puntatore dello stack della funzione contenitore. Le implementazioni più comuni includono le espressioni delle clausole catch (SEH) e SEH (Structured Exception Handling) di Windows. Di conseguenza, chiamare in modo esplicito _alloca
in uno dei seguenti scenari genera un errore di programma durante la restituzione alla routine EH chiamante:
Espressione filtro eccezioni WINDOWS SEH:
__except ( _alloca() )
Gestore di eccezioni finale di Windows SEH:
__finally { _alloca() }
Espressione della clausola catch EH C++
Tuttavia, _alloca
può essere chiamato direttamente dall'interno di una routine EH o da un callback fornito dall'applicazione che viene richiamato da uno degli scenari EH elencati in precedenza.
Importante
Se _alloca
viene chiamato all'interno di un blocco try, è necessario chiamare _resetstkoflw
nel blocco catch.
Oltre alle restrizioni precedenti, quando si usa l'opzione_alloca
/clr
(Compilazione Common Language Runtime) non può essere usata nei __except
blocchi. Per altre informazioni, vedere /clr
Restrizioni.
Requisiti
Ciclo | Intestazione obbligatoria |
---|---|
_alloca |
<malloc.h> |
Esempio
// 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
Vedi anche
Allocazione di memoria
calloc
malloc
realloc
_resetstkoflw
_malloca