面試經典題:int a; 用完無需管,但指針 malloc 卻必須 free?本文從內存模型角度徹底講清棧與堆的區別,助你從根上理解資源管理。
| 維度 | 棧 | 堆 |
|---|---|---|
| 分配方式 | 編譯器自動分配/釋放 | 程序員手動 malloc/free 或 new/delete |
| 生命周期 | 隨函數調用進棧、返回出棧 | 從分配到顯式釋放或進程結束 |
| 典型對象 | 局部變量、函數參數、返回地址 | 動態分配的數組、結構體、對象 |
| 大小限制 | 較小(通常 1-8 MB) | 僅受虛擬地址空間限制 |
void func() {
int a = 10; // 棧上,func 結束自動銷毀
int *p = malloc(4); // 堆上,必須 free(p),否則洩漏
// ...
free(p); // 手動歸還
}
push/pop),極快,由編譯器插入序言/尾聲代碼自動管理。使用智能指針(std::unique_ptr, std::shared_ptr)或容器(std::vector)實現 RAII,讓編譯器自動調用析構函數釋放堆內存,杜絕手動 free 忘記/出錯。