_malloca
Alloca memoria sullo stack.Si tratta di una versione di _alloca con i miglioramenti della sicurezza come descritto in Funzionalità di sicurezza in CRT.
void *_malloca(
size_t size
);
Parametri
- size
Byte da allocare lo stack.
Valore restituito
_malloca 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, _malloca 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
_malloca alloca size byte dallo stack del programma o dall'heap se la richiesta supera la dimensione in byte fornita da _ALLOCA_S_THRESHOLD.La differenza tra _malloca e _alloca è quello _alloca alloca sempre nello stack, indipendentemente dalle dimensioni.A differenza di _alloca, che non richiede o non consentono una chiamata free per liberare la memoria allocata, pertanto _malloca richiede l'utilizzo di _freea per liberare memoria.In modalità di debug, _malloca alloca sempre la memoria dall'heap.
Esistono restrizioni in modo esplicito a chiamare _malloca 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 _malloca in uno dei seguenti scenari non riuscirà di programma per tornare alla routine chiamante di EH:
Windows NT SEH espressione di filtro eccezioni: __except(_malloca () )
Windows NT SEH gestore di eccezioni finale: __finally {_malloca () }
Espressione della clausola catch di EH di C++
tuttavia, _malloca 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 _malloca 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, _malloca non è possibile utilizzare in __except blocchi.Per ulteriori informazioni, vedere restrizioni di /clr.
Requisiti
routine |
Intestazione di associazione |
---|---|
_malloca |
<malloc.h> |
Esempio
// crt_malloca_simple.c
#include <stdio.h>
#include <malloc.h>
void Fn()
{
char * buf = (char *)_malloca( 100 );
// do something with buf
_freea( buf );
}
int main()
{
Fn();
}
// crt_malloca_exception.c
// This program demonstrates the use of
// _malloca and trapping any exceptions
// that may occur.
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
int main()
{
int size;
int numberRead = 0;
int errcode = 0;
void *p = NULL;
void *pMarker = NULL;
while (numberRead == 0)
{
printf_s("Enter the number of bytes to allocate "
"using _malloca: ");
numberRead = scanf_s("%d", &size);
}
// Do not use try/catch for _malloca,
// use __try/__except, since _malloca throws
// Structured Exceptions, not C++ exceptions.
__try
{
if (size > 0)
{
p = _malloca( size );
}
else
{
printf_s("Size must be a positive number.");
}
_freea( p );
}
// Catch any exceptions that may occur.
__except( GetExceptionCode() == STATUS_STACK_OVERFLOW )
{
printf_s("_malloca failed!\n");
// If the stack overflows, use this function to restore.
errcode = _resetstkoflw();
if (errcode)
{
printf("Could not reset the stack!");
_exit(1);
}
};
}
Input
1000
Esempio di output
Enter the number of bytes to allocate using _malloca: 1000
Equivalente .NET Framework
Non applicabile. Per chiamare la funzione c standard, utilizzare PInvoke. Per ulteriori informazioni, vedere Esempi di pinvoke.