Sdílet prostřednictvím


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);
     }
  }
}

Viz také

Referenční dokumentace

MALLOC

_alloca

_malloca

Další zdroje

Referenční Standardní knihovna C++