Compartilhar via


C6263

aviso C6263: Usando _alloca em um loop; isso pode rapidamente causar um estouro de pilha

Este aviso indica que chamar _alloca dentro de um loop para alocar memória pode causar estouro de pilha. _alloca aloca memória de pilha, mas essa memória só é liberada quando a função de chamada sai.A pilha, mesmo no modo de usuário, é limitada, e a falha ao confirmar uma página de pilha causa uma exceção de estouro de pilha.A função de _resetstkoflw é recuperada de uma condição de estouro de pilha, permitindo que um programa continue em vez de falhar com um erro fatal de exceção.Se a função _resetstkoflw não for chamada, não há nenhuma página de proteção após a exceção anterior.Na próxima vez em que houver um estouro de pilha, não haverá exceções e o processo será encerrado sem nenhum aviso.

Você deve evitar chamar _alloca dentro de um loop se o tamanho de alocação ou a contagem de iteração é desconhecido porque pode causar um estouro de pilha.Em tais casos, considere outras opções, como memória de heap, ou classes de Referência da Biblioteca Padrão C++.

Exemplo

O código a seguir gera este aviso:

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

O código a seguir usa malloc( ) para corrigir esse aviso:

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

Consulte também

Referência

malloc

_alloca

_malloca

Outros recursos

Referência da Biblioteca Padrão C++