C6262

警告 C6262:函数使用了堆栈中的 <constant> 个字节: 超过了 /analyze:stacksize<constant>。 请考虑将某些数据移到堆中

此警告指出在函数内检测到了超出预设阈值的堆栈使用率。 默认情况下,当堆栈大小超过 16K 字节时会生成此警告。 堆栈是有限的,甚至在用户模式下也是如此,如果无法提交堆栈页,会导致堆栈溢出异常。 _resetstkoflw 函数可以将系统从堆栈溢出的情况恢复为正常,从而使程序得以继续运行,而不会由于出现异常错误而失败。 如果未调用 _resetstkoflw 函数,则在上一个异常后不会显示保护页。 当下次发生堆栈溢出时,根本不会显示异常,进程将在没有任何警告的情况下终止。

若要更正此警告,既可以将一些数据移至堆,也可以增加堆栈大小。 无论采取哪一种更正措施,在对代码进行更改前均应考虑到所用方法的利弊。

示例

下面的代码生成此警告,因为 char buffer 分配 16382 个字节,而局部整数变量 i 又分配 4 个字节,两者合起来超过了 16K 字节的默认堆栈大小限制:

#include <windows.h>
#define MAX_SIZE 16382

void f( )
{
  int i;
  char buffer[MAX_SIZE];
  
  i = 0;
  buffer[0]='\0';

  // code...
}

下面的代码通过将一些数据移至堆来更正此警告:

#include <stdlib.h>   
#include <malloc.h>
#define MAX_SIZE 16382
void f( )
{
  int i;
  char *buffer;

  i = 0;
  buffer = (char *) malloc( MAX_SIZE );
  if (buffer != NULL) 
  {
    buffer[0] = '\0';
    // code...
    free(buffer);
  }
}

若要通过调整堆栈大小来更正此警告,请执行下列步骤:

  1. 在**“项目”菜单上,单击“属性”**。

    此时将显示**“属性页”**对话框。

  2. 展开“配置属性”树。

  3. 展开“C/C++”树。

  4. 单击“命令行”属性。

  5. 在**“附加选项”**中添加 /analyze:stacksize16388。

请参见

任务

如何:使用本机运行时检查

参考

/STACK(堆栈分配)

_resetstkoflw