Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Allokerar minne på stacken. Den här funktionen är inaktuell eftersom det finns en säkrare version. se _malloca.
Syntax
void *_alloca(
size_t size
);
Parameterar
size
Byte som ska allokeras från stacken.
Returvärde
Rutinen _alloca 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 _alloca allokerar ett objekt med noll längd och returnerar en giltig pekare till objektet.
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 ).
Anmärkningar
_alloca allokerar size byte från programstacken. Det allokerade utrymmet frigörs automatiskt när den anropande funktionen avslutas (inte när allokeringen bara lämnar omfånget). Skicka därför inte pekarvärdet som returneras av _alloca som ett argument till free.
Det finns begränsningar för att uttryckligen anropa _alloca 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-strukturerad undantagshantering (SEH) och C++-catch-satsuttryck. Därför resulterar explicit anrop _alloca i något av följande scenarier i programfel under återgången till den anropande EH-rutinen:
Windows SEH-undantagsfilteruttryck:
__except ( _alloca() )Windows SEH slutlig undantagshanterare:
__finally { _alloca() }C++ EH catch-satsuttryck
Kan dock _alloca 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 _alloca anropas i ett försöksblock 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_alloca (Common Language Runtime Compilation).__except Mer information finns i /clr Begränsningar.
Kravspecifikation
| Rutin | Obligatoriskt huvud |
|---|---|
_alloca |
<malloc.h> |
Example
// 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 occurred 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 == 0) // _resetstkoflw() returns 0 on failure
{
printf_s("Could not reset the stack!\n");
_exit(1);
}
};
}
Allocated 1000 bytes of stack at 0x0012FB50
Se även
Minnesallokering
calloc
malloc
realloc
_resetstkoflw
_malloca