C6262
警告 C6262: 函式使用 <常數> 個位元組的堆疊: 超過 /analyze:stacksize<常數 2>。請考慮將部分資料移至堆積
這則警告表示在函式內部偵測到堆疊的使用方式 (constant 2) 已超過預設臨界值。這個警告的預設堆疊框架大小為 16 KB (使用者模式),而核心模式則是 1 KB。即使是在使用者模式中,堆疊還是會受到限制,且無法認可堆疊分頁會造成堆疊溢位的例外狀況。核心模式具有 12 KB 堆疊大小限制因此無法被加入,核心模式程式碼應該盡量限制堆疊上的使用。
若要更正這個警告背後的問題,您可以將部分資料移至堆積或移至其他動態記憶體。在使用者模式中,大型堆疊框架可能不是問題和這項警告可能是隱藏的,但是一大堆疊框架將增加堆疊溢位的風險。(A 的堆疊框架可能會在函式大量使用堆疊或遞迴時發生)。如果堆疊溢位真正發生,堆疊總大小在使用者模式中只會遞增,僅由系統限制來決策。您可以使用 /analyze 命令列選項變更 <constant 2>的值,但是會提高將它引入錯誤的風險,而且不會被報告。
核心模式程式碼-例如按下驅動程式 <constant 2> 專案的這個值設定為 1 KB。編寫完善的驅動程式應該具有非常少的函式,其接近這個值,並可能將限制會向下壓。在使用者模式程式碼可以減少堆疊大小的相同技術也可以被核心模式所使用。
範例
下列程式碼會產生這則警告,因為 char buffer 會配置 16,382 個位元組,而區域的整數變數 i 會另外再配置 4 個位元組,兩者總和將超過預設的堆疊大小限制 16 KB。
// cl.exe /c /analyze /EHsc /W4
#include <windows.h>
#define MAX_SIZE 16382
void f( )
{
int i;
char buffer[MAX_SIZE];
i = 0;
buffer[0]='\0';
// code...
}
下列程式碼會藉由將部分資料移至堆積來更正這則警告。
// cl.exe /c /analyze /EHsc /W4
#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);
}
}
就記憶體遺漏和例外狀況而言, malloc 和 free 的使用上有很多缺點。若要避免這類遺漏和例外狀況的問題,請使用 C++ Standard Template Library (STL) 提供的機制。其中包括 shared_ptr、 unique_ptr和 vector。如需詳細資訊,請參閱智慧型指標 (現代 C++)與C++ 標準程式庫參考。
藉由調整堆疊大小來更正這個警告。
在功能表列上,選擇 [專案]、[屬性]。
[屬性頁] 對話方塊隨即顯示。
展開 [組態屬性]。
展開 [C/C++]。
選取 [命令列] 屬性。
請在 [其他選項] 中加入 /analyze:stacksize16388。