C6263
警告 C6263: 迴圈中的 using _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);
}
}
}