_malloca
Alloca memoria nello stack. Questa funzione è una versione di con miglioramenti della _alloca
sicurezza, come descritto in Funzionalità di sicurezza in CRT.
Sintassi
void *_malloca(
size_t size
);
Parametri
size
Byte da allocare dallo stack.
Valore restituito
La _malloca
routine restituisce un void
puntatore allo spazio allocato, 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 a tale elemento.
Se size
è maggiore di _ALLOCA_S_THRESHOLD
, _malloca
tenta di allocare nell'heap e restituisce un puntatore Null se lo spazio non può essere allocato. Se size
è minore o uguale a _ALLOCA_S_THRESHOLD
, _malloca
tenta di allocare nello stack e viene generata un'eccezione di overflow dello stack se lo spazio non può essere allocato. 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) per rilevare questa eccezione.
Osservazioni:
_malloca
alloca size
byte dall'heap o dallo stack di programma se la richiesta supera una determinata dimensione in byte fornita da _ALLOCA_S_THRESHOLD
. La differenza tra _malloca
e _alloca
è che _alloca
alloca sempre nello stack, indipendentemente dalle dimensioni. A differenza di _alloca
, che non richiede o consente una chiamata a liberare free
la memoria così allocata, _malloca
richiede l'uso di _freea
per liberare memoria. In modalità debug, _malloca
alloca sempre la memoria dall'heap.
Esistono restrizioni per chiamare in modo esplicito _malloca
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 la gestione delle eccezioni strutturata di Windows NT e le espressioni con clausola catch C++. Di conseguenza, chiamare in modo esplicito _malloca
in uno dei seguenti scenari genera un errore di programma durante la restituzione alla routine EH chiamante:
Espressione filtro eccezioni WINDOWS SEH:
__except
(_malloca ()
)Gestore di eccezioni finale di Windows SEH:
__finally
{_malloca ()
}Espressione della clausola catch EH C++
Tuttavia, _malloca
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
In Windows, se _malloca
viene chiamato all'interno di un try/catch
blocco, è necessario chiamare _resetstkoflw
nel blocco catch.
Oltre alle restrizioni precedenti, quando si usa l'opzione _malloca
/clr
(Compilazione Common Language Runtime) non può essere usata nei __except
blocchi. Per altre informazioni, vedere /clr
Restrizioni.
Requisiti
Ciclo | Intestazione obbligatoria |
---|---|
_malloca |
<malloc.h> |
Esempio: _malloca
// 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();
}
Esempio: _malloca
eccezione
// 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
Output di esempio
Enter the number of bytes to allocate using _malloca: 1000