Поделиться через


C6263

Предупреждение C6263: использование _alloca в цикле может привести к быстрому переполнению стека.

Данное предупреждение указывает, что вызов функции _alloca в цикле для выделения памяти может привести к переполнению стека. _alloca выделяет память из стека, однако освобождение памяти происходит только после выхода вызывающей функции. Размер стека ограничен даже в пользовательском режиме; при невозможности зафиксировать страницу стека возникает ошибка переполнения стека. Восстановление стека после переполнения можно выполнить с помощью функции _resetstkoflw. Эта функция позволяет продолжить работу программы и предотвращает сбой в результате неустранимой ошибки. Если функция _resetstkoflw не вызывается, то страница защиты после предыдущего исключения не создается. При следующем переполнении стека исключение не создается и процесс прекращает работу без вывода предупреждения.

Если размер выделенной памяти или количество итераций неизвестны, следует избегать вызова функции _alloca внутри цикла, поскольку это может привести к переполнению стека. В таких случая рассмотрите другие возможности, например выделение памяти в куче или использование классов Standard C++ Library Reference.

Пример

Данное предупреждение создается в следующем коде:

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

В следующем коде для устранения этого предупреждения используется функция malloc( ):

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

См. также

Ссылки

malloc

_alloca

_malloca

Другие ресурсы

Standard C++ Library Reference