C6263
警告 C6263:在循环中使用 _alloca: 这样会很快造成堆栈溢出
此警告意味着为分配内存而在循环内调用 _alloca 会导致堆栈溢出。 _alloca 从堆栈分配内存,但是只有当调用函数退出时,该内存才释放。 堆栈是有限的,甚至在用户模式下也是如此,如果无法提交堆栈页,会导致堆栈溢出异常。 _resetstkoflw 函数可以将系统从堆栈溢出的情况恢复为正常,从而使程序得以继续运行,而不会由于出现异常错误而失败。 如果未调用 _resetstkoflw 函数,则在上一个异常后不会显示保护页。 当下次发生堆栈溢出时,根本不会显示异常,进程将在没有任何警告的情况下终止。
如果分配大小或迭代次数是未知的,则应当避免在循环内部调用 _alloca,因为这样可能会导致堆栈溢出。 在这些情况下,请考虑使用其他选项,如堆内存或 标准C++库参考 类。
示例
下面的代码生成此警告:
#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);
}
}
}