_malloca

 

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

Alloue de la mémoire sur la pile. Il s’agit d’une version de _alloca avec des améliorations de sécurité comme décrit dans fonctionnalités de sécurité de la bibliothèque CRT.

void *_malloca(   
   size_t size   
);  

Paramètres

size
Octets à allouer de la pile.

Le _malloca 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, _malloca 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).

_mallocaalloue size octets à partir de la pile du programme ou le tas si la demande dépasse une certaine taille en octets donné par _ALLOCA_S_THRESHOLD. La différence entre _malloca et _alloca qui est _alloca alloue toujours sur la pile, quelle que soit la taille. Contrairement aux _alloca, qui ne requièrent pas ou n’autoriser un appel à free pour libérer la mémoire allouée par conséquent, _malloca nécessite l’utilisation de _freea pour libérer de la mémoire. En mode débogage, _malloca toujours alloue de la mémoire à partir du tas.

Il existe des restrictions à appeler explicitement _malloca 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 _malloca 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 (_malloca () )

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

  • Expression de la clause catch C++ EH

Toutefois, _malloca 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 _malloca 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, _malloca ne peut pas être utilisée dans __except blocs. Pour plus d'informations, consultez /clr Restrictions.

RoutineEn-tête requis
_malloca<malloc.h>
// 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);  
        }  
    };  
}  

1000  

Enter the number of bytes to allocate using _malloca: 1000  

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

Afficher: