Condividi tramite


_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 sicurezzaNota 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.

Vedere anche

Riferimenti

Allocazione di memoria

calloc

malloc

realloc

_resetstkoflw