| 區域 | 分配方式 | 生命周期管理 | 典型內容 |
|---|---|---|---|
| 棧 | 編譯器自動 | 作用域結束自動銷毀 | 局部變量、函數參數、返回地址 |
| 堆 | new | 程序員 delete,進程結束 OS 回收 | 動態對象 |
| 自由存儲區 | malloc/realloc | 程序員 free | C 風格動態內存 |
| 全局/靜態區 | 編譯期/鏈接期 | 進程結束釋放 | 全局變量、靜態變量(C++ 無初始化/未初始化之分) |
| 常量區 | 編譯期 | 只讀,進程結束釋放 | 字面量、const 全局/靜態對象 |
| 維度 | 堆 | 棧 |
|---|---|---|
| 管理 | 手動 | 自動 |
| 空間 | ~4GB (32位) | 默認 1MB (VC6),可調 |
| 碎片 | 頻繁分配釋放產生 | 先進後出,無碎片 |
| 增長方向 | 不定 | 向低地址 |
| 分配方式 | 鏈表/樹管理空閒塊 | 指針遞減 |
| 效率 | 較慢(系統調用、鎖) | 極快(指針移動) |
void f() { int* p = new int[5]; }
p 在棧(4 字節),指向的 int[5] 在堆(20 字節)。釋放需 delete[] p。
Project → Settings → Link → Output → Reserve/Commit 設置堆/棧保留與提交大小。