共用方式為


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

請參閱

參考

malloc

_alloca

_malloca

其他資源

標準 C++ 程式庫參考