核心差異對比表
| 維度 | 棧 | 堆 |
| 分配方式 | 系統自動分配(如局部變量 int b) | 程序員手動申請(malloc/new),指定大小 |
| 釋放方式 | 作用域結束自動釋放 | 手動釋放(free/delete),否則泄漏(程序結束由 OS 回收) |
| 生長方向 | 向低地址擴展,連續內存 | 向高地址擴展,非連續(鏈表式管理) |
| 大小限制 | 較小(通常 1-8MB),棧溢出風險 | 較大(受限於虛擬地址空間),易產生碎片 |
| 分配效率 | 極快(指針移動),無碎片 | 較慢(查找合適塊),有碎片 |
| 存儲內容 | 函數調用幀:返回地址、參數、局部變量 | 程序員自定義,堆頭通常存塊大小 |
代碼示例:指針在棧,對象在堆
void f() {
int* p = new int[5]; // p 在棧,new int[5] 在堆
} // p 自動銷燬,但堆內存未釋放 → 泄漏!需 delete[] p;
總結口訣
stack = 棧:自動管理、空間小、速度快、存局部變量/調用幀。
heap = 堆:手動管理、空間大、速度慢、存動態對象。
- C 用
malloc/free,C++ 用 new/delete(會調用構造/析構)。
- 編譯期確定的變量/參數在棧;運行期動態申請在堆。
本文出自「IT民工一枚」博客,轉載請保留出處:原文鏈接