| 區域 | 內容 | 管理方式 | 生命週期 |
|---|---|---|---|
| 棧 | 函數參數、局部變量、返回地址、寄存器保存 | 編譯器自動分配/釋放 | 函數調用期間 |
| 堆 | malloc/new 申請的動態內存 | 程序員手動 free/delete,進程結束 OS 回收 | 申請到釋放 |
| 全局/靜態區 | 全局變量、static 變量 (分初始化/未初始化兩段) | 編譯時分配,進程結束釋放 | 整個程序運行期 |
| 常量區 | 字符串字面值、const 全局變量 | 編譯時分配,只讀 | 整個程序運行期 |
| 代碼區 | 函數二進制機器碼 | 只讀 | 整個程序運行期 |
push/pop 級支持,極快,空間有限 (Win 默認 1-2MB)。malloc/free、new/delete,靈活大,但易產生碎片、洩漏,效率較低 (鏈表尋找塊)。| 維度 | 棧 | 堆 |
|---|---|---|
| 增長方向 | 向低地址 | 向高地址 |
| 連續性 | 連續 | 不連續 (鏈表管理空閒塊) |
| 大小限制 | 編譯期固定 (可調) | 受限於虛擬內存 (32位 4GB) |
| 分配速度 | 極快 (指令級) | 較慢 (庫函數搜索/分裂/合併) |
| 碎片 | 無 (先進後出) | 易產生外部碎片 |
| 適用場景 | 小型、生命週期固定、高頻 | 大型、動態、不定大小 |
new:調用構造函數,類型安全,拋出 bad_alloc,可重載。malloc:僅分配原始字節,不調用構造函數,返回 void* 需強轉,失敗返回 NULL。delete:調用析構函數;free 不調用。**嚴禁混用** (new 必配 delete,malloc 必配 free)。auto(默認)、static、register、externchar *p = "abc"; → 字符串在常量區,p 在棧,p[0]='d' → **未定義行為 (段錯誤)**。static 或堆分配。nullptr,智能指針管理。#pragma pack、成員排序優化。