C6263
Aviso C6263: usando _alloca em um loop; Isso pode rapidamente de estouro de pilha
Este aviso indica que a chamada _alloca dentro de um loop para alocar a memória pode causar estouro de pilha._alloca aloca a memória da pilha, mas que a memória seja liberada somente quando a função de chamada é encerrado.Pilha, mesmo no modo de usuário, é limitada e Falha ao confirmar uma página da pilha causa uma exceção de estouro de pilha.O _resetstkoflw função recupera de uma condição de estouro de pilha, permitindo que um programa continuar em vez de apresentar com um erro de exceção fatal.Se a _resetstkoflw não é chamada de função, não há nenhuma página de proteção após a exceção anterior.Na próxima vez em que há uma pilha de estouro, existem em todos os não permitir exceções e o processo é encerrado sem aviso.
Você deve evitar chamada _alloca dentro de um loop se o tamanho de alocação ou a contagem de iteração estiver desconhecida porque ele pode causar um estouro de pilha.Nesses casos, considere outras opções como memória de heap, ou Standard C++ Library Reference classes.
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 (de) 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);
}
}
}