程序運行時觸發 Stack Overflow,常見於大局部數組、深度遞歸或大對象棧上分配。
| 特性 | 棧 | 堆 |
|---|---|---|
| 分配方式 | 編譯器自動管理 | 程序員手動管理 |
| 大小限制 | Windows 默認 1MB(主線程) | 受限於虛擬內存(GB 級) |
| 分配速度 | 極快(指針移動) | 較慢(鏈表查找/系統調用) |
| 碎片風險 | 無 | 有 |
| 典型用途 | 局部變量、函數參數、返回地址 | 動態數據、大對象、生命週期不固定對象 |
// ❌ 棧上分配大數組
char buffer[1024 * 1024]; // 1MB 直接炸棧
// ✅ 堆上分配
std::vector<char> buffer(1024 * 1024); // 或 new/malloc
// 用完自動釋放/手動釋放
VS 屬性頁 → Linker → System → Stack Reserve Size,默認 1000000 (1MB),改為 10000000 (10MB) 或更大。
缺點:掩蓋設計缺陷,線程池場景會放大總內存佔用。
FS:[0] (x86) / GS:[0] (x64) 指向 TEB/analyze 靜態分析捕獲潛在棧溢出CreateThread dwStackSize)
屬性頁 → Linker → System → Stack Reserve Size / Stack Commit Size