C6263
upozornění C6263: pomocí _alloca smyčky; to rychle přetečení zásobníku
Toto upozornění znamená, že volání _alloca uvnitř smyčky přidělení paměti může způsobit přetečení zásobníku._alloca přiděluje paměť ze zásobníku, ale, že paměť je uvolněna pouze při ukončení volání funkce.Zásobník i v uživatelském režimu, je omezena a způsobí selhání stránky zásobníku potvrzení výjimce přetečení zásobníku._resetstkoflw Funkce obnoví ze stavu přetečení zásobníku, povolení programu pokračovat namísto chybného k závažné chybě.Pokud _resetstkoflw není zavolána funkce, neexistují žádná ochranná stránka po předchozí výjimky.Dalším je zásobníku přetečení, nejsou vůbec žádné výjimky a ukončí proces bez upozornění.
Neměli byste volací _alloca uvnitř smyčky, pokud velikost alokační nebo počet iterací neznámý, protože to může způsobit přetečení zásobníku.V těchto případech, zvažte další možnosti, například paměti haldy nebo Referenční Standardní knihovna C++ tříd.
Příklad
Následující kód vygeneruje toto upozornění:
#include <windows.h>
#include <malloc.h>
#include <excpt.h>
#include <stdio.h>
#define MAX_SIZE 50
void f ( int size )
{
char* cArray;
__try
{
for(int i = 0; i < MAX_SIZE; i++)
{
cArray = (char *)_alloca(size);
// process cArray...
}
}
__except(GetExceptionCode() == STATUS_STACK_OVERFLOW ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH )
{
// code...
puts("Allocation Failed");
_resetstkoflw();
}
}
Následující kód používá (malloc) opravit toto upozornění:
#include <windows.h>
#define MAX_SIZE 50
void f ( int size )
{
char* cArray;
for(int i = 0; i < MAX_SIZE; i++)
{
cArray = (char *) malloc(size);
if (cArray != NULL)
{
// process cArray...
free(cArray);
}
}
}