_malloca
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é du CRT.
void *_malloca(
size_t size
);
Paramètres
- size
octets à allouer de la pile.
Valeur de retour
La routine d' _malloca retourne un pointeur d' void à l'espace alloué, qui est obligatoirement aligné pour le stockage d'un type d'objet.Si size est 0, _malloca alloue un élément de longueur zéro et retourne un pointeur non valide pour cet élément.
une exception de dépassement de capacité de la pile est générée si l'espace ne peut pas être alloué.L'exception de dépassement de capacité de la pile n'est pas exception C++ ; il s'agit d'une exception structurée.Au lieu d'utiliser la gestion des exceptions C++, vous devez utiliser gestion structurée des exceptions fois SEH ().
Notes
_malloca alloue des octets d' size de la pile du programme ou du tas si la demande dépasse une certaine taille en octets données par _ALLOCA_S_THRESHOLD.La différence entre _malloca et _alloca est qu' _alloca alloue toujours sur la pile, quelle que soit la taille.Contrairement à _alloca, qui ne requiert pas ou ne permet pas à un appel à free de libérer la mémoire allouée par conséquent, _malloca nécessite l'utilisation de _freea à la mémoire.En mode débogage, _malloca toujours alloue la mémoire du tas.
Il existe des limites à appeler explicitement _malloca dans un gestionnaire d'exceptions (EH).Les routines de EH qui s'exécutent sur des processeurs de x86-class s'exécutent dans leur propre frame de la mémoire : Elles exécutent leurs tâches dans l'espace mémoire qui n'est pas sur la position actuelle du pointeur de pile de la fonction englobante.Les implémentations les plus courantes incluent des expressions de gestion structurée (SEH) des exceptions de Windows NT et de clause catch C++.Par conséquent, appeler explicitement _malloca dans l'un des scénarios suivants provoque l'échec du programme pendant le retour à la routine d'appel des EH :
Windows NT fois SEH expression de filtre d'exception : __except(_malloca () )
Windows NT fois SEH gestionnaire d'exceptions finale : __finally {}_malloca ()
Expression de la clause catch de EH C++
Toutefois, _malloca peut être appelé directement d'une routine de EH ou d'un rappel fourni par l'application qui est appelé par l'un des scénarios de EH précédemment répertoriées.
Note de sécurité |
---|
Dans Windows XP, si _malloca est appelé dans un bloc try/catch, vous devez appeler _resetstkoflw dans le bloc catch. |
En plus de les restrictions ci-dessus, vous utilisez l'option de /clr (Compilation du common langage runtime) , _malloca ne peut pas être utilisé dans des blocs d' __except .Pour plus d'informations, consultez restrictions de /clr.
Configuration requise
routine |
en-tête requis |
---|---|
_malloca |
<malloc.h> |
Exemple
// 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);
}
};
}
Entrée
1000
Résultat de l'exemple
Enter the number of bytes to allocate using _malloca: 1000
Équivalent .NET Framework
Non applicable. Pour appeler la fonction C standard, utilisez PInvoke. Pour plus d'informations, consultez l' exemples d'appel de code non managé.