_malloca
Přidělí paměť v zásobníku.Toto je verze _alloca s vylepšení zabezpečení popsaným v Funkce zabezpečení v CRT.
void *_malloca(
size_t size
);
Parametry
- size
Počet bajtů přiřazen ze zásobníku.
Vrácená hodnota
_malloca Rutinní vrátí void ukazatel na přidělený prostor, je zaručena vhodně zarovnání pro skladování jakýkoli typ objektu.Pokud size 0, _malloca přiděluje položce nulové délky a vrátí platný ukazatel na tuto položku.
Výjimkou přetečení zásobníku je generována, pokud nelze přidělit prostor.Výjimky přetečení zásobníku není C++ výjimku; je strukturované výjimky.Namísto použití C++ zpracování výjimek, je nutné použít Strukturované zpracování výjimek (SEH).
Poznámky
_mallocapřidělí size bajtů z programu zásobník nebo halda, pokud žádosti překročí určitou velikost v bajtech dán _ALLOCA_S_THRESHOLD.Rozdíl mezi _malloca a _alloca je _alloca vždy přiděluje v zásobníku, bez ohledu na velikost.Na rozdíl od _alloca, která nevyžaduje ani povolit volání free a uvolnit tak přidělené paměti _malloca , vyžaduje použití _freea paměti.V režimu ladění _malloca vždy přidělí paměť z haldy.
Existují omezení explicitně voláním _malloca v popisovač výjimky (EH).EH rutiny na x 86 třída procesory pracují v rámci své vlastní paměti: vykonávají své úkoly v paměťovém prostoru, který není založen na aktuální umístění ukazatel na zásobník ohraničujícím funkce.Nejběžnější implementace patří strukturovaného systému Windows NT výjimky (SEH) zpracování a výrazů klauzule catch C++.Proto explicitně voláním _malloca v libovolné z následujících scénářů výsledků selhání programu při návratu k volání rutiny EH:
Výraz filtru Windows NT S výjimkou: __except (_malloca () )
Popisovač konečné výjimky S Windows NT: __finally {_malloca () }
Výraz klauzule catch C++ EH
Však _malloca lze volat přímo z proceduru EH nebo z zpětné určený aplikací, která získá vyvolána jednou z dříve uvedených scénářů EH.
Poznámka k zabezpečení |
---|
V systému Windows XP Pokud _malloca se nazývá uvnitř bloku try/catch musí volat _resetstkoflw v bloku catch. |
Vedle výše uvedených omezení při použití /clr (kompilace společné Language Runtime) možnost, _malloca nelze použít v __except bloky.Další informace naleznete v /clr omezení.
Požadavky
Rutina |
Požadované záhlaví |
---|---|
_malloca |
<malloc.h> |
Příklad
// 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);
}
};
}
Vstup
1000
Vzorový výstup
Enter the number of bytes to allocate using _malloca: 1000
Ekvivalent v rozhraní .NET Framework
Nelze použít Použijte volání funkce standardní C, PInvoke. Další informace naleznete v tématu Příklady vyvolat platformu.