C6263

更新:2007 年 11 月

警告 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