Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Allokerar minne på stacken. Den här funktionen är en version av _alloca med säkerhetsförbättringar enligt beskrivningen i Säkerhetsfunktioner i CRT.
Syntax
void *_malloca(
size_t size
);
Parameterar
size
Byte som ska allokeras från stacken.
Returvärde
Rutinen _malloca returnerar en void pekare till det allokerade utrymmet, som är lämpligt justerat för lagring av alla typer av objekt. Om size är 0 _malloca allokerar ett objekt med noll längd och returnerar en giltig pekare till objektet.
Om size är större än _ALLOCA_S_THRESHOLDförsöker du _malloca allokera på heapen och returnerar en null-pekare om utrymmet inte kan allokeras. Om size är mindre än eller lika med _ALLOCA_S_THRESHOLDförsöker du _malloca allokera på stacken och ett stacköverflödesfel genereras om utrymmet inte kan allokeras. Undantaget stackspill är inte ett C++-undantag. det är ett strukturerat undantag. I stället för att använda C++-undantagshantering måste du använda SEH (Structured exception handling ) för att fånga upp det här undantaget.
Anmärkningar
_malloca allokerar size byte från programstacken eller heapen om begäran överskrider en viss storlek i byte som anges av _ALLOCA_S_THRESHOLD. Skillnaden mellan _malloca och _alloca är att _alloca alltid allokeras på stacken, oavsett storlek. Till skillnad från _alloca, som inte kräver eller tillåter ett anrop till för att free frigöra minnet så allokerat, _malloca kräver användning av _freea för att frigöra minne. I felsökningsläge _malloca allokerar du alltid minne från heapen.
Det finns begränsningar för att uttryckligen anropa _malloca i en undantagshanterare (EH). EH-rutiner som körs på x86-klassprocessorer fungerar i sin egen minnesram: De utför sina uppgifter i minnesutrymmet som inte baseras på den aktuella platsen för stackpekaren för den omslutande funktionen. De vanligaste implementeringarna är windows NT-strukturerad undantagshantering (SEH) och C++-catch-satsuttryck. Därför resulterar explicit anrop _malloca i något av följande scenarier i programfel under återgången till den anropande EH-rutinen:
Windows SEH-undantagsfilteruttryck:
__except(_malloca ())Windows SEH slutlig undantagshanterare:
__finally{_malloca ()}C++ EH catch-satsuttryck
Kan dock _malloca anropas direkt från en EH-rutin eller från ett återanrop från program som anropas av något av de EH-scenarier som tidigare angavs.
Viktigt!
Om anropas i ett _malloca block i Windows try/catch måste du anropa _resetstkoflw i catch-blocket.
Förutom ovanstående begränsningar kan du inte använda alternativet (Common Language Runtime-kompilering) i block när du använder/clr alternativet_malloca (Common Language Runtime Compilation).__except Mer information finns i /clr Begränsningar.
Kravspecifikation
| Rutin | Obligatoriskt huvud |
|---|---|
_malloca |
<malloc.h> |
Exempel: _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();
}
Exempel: _malloca undantag
// 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);
}
};
}
Inmatning
1000
Exempelresultat
Enter the number of bytes to allocate using _malloca: 1000