_alloca

 

Pour obtenir la dernière documentation sur Visual Studio 2017, consultez Documentation Visual Studio 2017.

Alloue de la mémoire sur la pile. Cette fonction est déconseillée, car une version plus sécurisée est disponible ; consultez la page _malloca.

void *_alloca(   
   size_t size   
);  

Paramètres

[in] size
Octets à allouer de la pile.

Le _alloca routine retourne un void pointeur vers l’espace alloué, qui est obligatoirement aligné correctement pour le stockage de tout type d’objet. Si size est 0, _alloca alloue un élément vide et retourne un pointeur valid vers cet élément.

Une exception de dépassement de capacité de pile est générée si l’espace ne peut pas être alloué. L’exception de dépassement de capacité de pile n’est pas une exception C++ ; Il est une exception structurée. Au lieu d’utiliser la gestion des exceptions C++, vous devez utiliser gestion structurée des exceptions (SEH).

_allocaalloue size octets à partir de la pile du programme. L’espace alloué est automatiquement libérée lorsque la fonction d’appel s’arrête (pas quand l’allocation n’est hors de portée). Par conséquent, ne passez pas de la valeur de pointeur retournée par _alloca en tant qu’argument à libre.

Il existe des restrictions à appeler explicitement _alloca dans un gestionnaire d’exceptions (GE). Routines de gestion des exceptions qui s’exécutent sur des processeurs de classe x86 opèrent dans le cadre de leur propre mémoire : ils effectuer leurs tâches dans un espace mémoire qui n’est pas basé sur l’emplacement actuel du pointeur de pile de la fonction englobante. Les implémentations courantes incluent Windows NT structuré gestion des exceptions (SEH) et des expressions de clause catch C++. Par conséquent, appeler explicitement _alloca dans un des résultats de défaillance du programme pendant le retour de l’appel de la routine EH scénarios suivants :

  • Expression de filtre d’exception SEH de Windows NT : __except (_alloca () )

  • Gestionnaire d’exceptions finale de Windows NT SEH : __finally {_alloca () }

  • Expression de la clause catch C++ EH

Toutefois, _alloca peut être appelée directement à partir d’une routine de gestion des exceptions ou à partir d’un rappel fourni par l’application appelée par l’un des scénarios de gestion des exceptions répertoriées précédemment.

System_CAPS_ICON_important.jpg Important

Dans Windows XP, si _alloca est appelée à l’intérieur d’un bloc try/catch, vous devez appeler _resetstkoflw dans le bloc catch.

Outre les restrictions ci-dessus, lorsque vous utilisez la/clr (Compilation pour le Common Language Runtime) option, _alloca ne peut pas être utilisée dans __except blocs. Pour plus d'informations, consultez /clr Restrictions.

RoutineEn-tête requis
_alloca<malloc.h>
// 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 occured 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)  
        {  
            printf_s("Could not reset the stack!\n");  
            _exit(1);  
        }  
    };  
}  

Allocated 1000 bytes of stack at 0x0012FB50  

Non applicable. Pour appeler la fonction C standard, utilisez PInvoke. Pour plus d'informations, consultez Exemples d'appel de plateforme.

Allocation de mémoire
calloc
malloc
realloc
_resetstkoflw
_malloca

Afficher: