_alloca
Alloca memoria sullo stack.Questa funzione è deprecata poiché una versione più sicura è disponibile; vedere _malloca.
void *_alloca(
size_t size
);
Parametri
- [in] size
Byte da allocare lo stack.
Valore restituito
_alloca la routine restituisce un' void puntatore allo spazio allocato, che è garantito che sia 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 per l'elemento.
Un'eccezione di overflow dello stack viene generata se lo spazio non può essere allocata.L'eccezione di overflow dello stack non fa eccezione C++, è un'eccezione strutturata.Anziché utilizzare la gestione delle eccezioni C++, è necessario utilizzare Gestione delle eccezioni strutturata (SEH).
Note
_alloca alloca size byte dallo stack del programma.Lo spazio allocato automaticamente viene liberato al termine della funzione chiamante (non quando l'allocazione solo passa dall'ambito).Di conseguenza, non passare il valore del puntatore restituito da _alloca come argomento a libero.
Esistono restrizioni in modo esplicito a chiamare _alloca in un gestore di eccezioni (EH).Le routine di EH in esecuzione su processori di x86-class funzionano nel relativo frame di memoria: Eseguono le attività nello spazio di memoria non basato sulla posizione corrente del puntatore dello stack della funzione che lo contiene.Le implementazioni più comuni includono espressioni di gestione delle (SEH) eccezioni strutturata di Windows NT e la clausola catch C++.Di conseguenza, chiamare in modo esplicito _alloca in uno dei seguenti scenari non riuscirà di programma per tornare alla routine chiamante di EH:
Windows NT SEH espressione di filtro eccezioni: __except (_alloca () )
Windows NT SEH gestore di eccezioni finale: __finally {_alloca () }
Espressione della clausola catch di EH di C++
tuttavia, _alloca può essere chiamato direttamente dall'interno di una routine di EH o da un callback applicazione-fornito che viene richiamato da uno degli scenari di EH sopra elencati.
Nota sulla sicurezza |
---|
in Windows XP, se _alloca viene chiamato in un blocco try/catch, è necessario chiamare _resetstkoflw nel blocco catch. |
Oltre alle limitazioni di precedenza quando si utilizzano/clr (Compilazione di Common Language Runtime) opzione, _alloca non è possibile utilizzare in __except blocchi.Per ulteriori informazioni, vedere restrizioni di /clr.
Requisiti
routine |
Intestazione di associazione |
---|---|
_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 occured 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)
{
printf_s("Could not reset the stack!\n");
_exit(1);
}
};
}
Equivalente .NET Framework
Non applicabile. Per chiamare la funzione c standard, utilizzare PInvoke. Per ulteriori informazioni, vedere Esempi di pinvoke.