Condividi tramite


_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

Vedi anche

Allocazione di memoria
calloc
malloc
realloc
_resetstkoflw