_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. Anziché usare la gestione delle eccezioni C++, è necessario usare la gestione delle eccezioni strutturate (edizione Standard H).

Osservazioni:

_allocasize 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 la gestione delle eccezioni strutturata di Windows (edizione Standard H) e le espressioni di clausola catch C++. 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 di Windows edizione Standard H:__except ( _alloca() )

  • Gestore di eccezioni finale di Windows edizione Standard H:__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