理解 C++ 程式記憶體佈局,是撰寫高效、安全、無記憶體洩漏程式的前提。C++ 將執行期記憶體劃分為五大區域,各有分配機制、生命週期、管理責任與用途。本文系統解析五大區域特性、初始化規則差異、常見錯誤與現代最佳實踐。
| 區域 | 英文 | 分配/釋放 | 存放內容 | 生命週期 |
|---|---|---|---|---|
| 堆疊 | Stack | 編譯器自動 | 函式參數、區域變數、返回位址 | 函式呼叫期間 |
| 堆 | Heap | 程式設計師手動 | 動態分配物件 | 手動釋放或程式結束 |
| 全域/靜態 | Global/Static | 系統自動 | 全域變數、static 變數 | 程式整個執行期間 |
| 常數區 | Literal/Const | 系統自動 | 字串常數、const 物件 | 程式整個執行期間 |
| 程式碼區 | Code/Text | 系統自動 | 函式機器碼、二進位指令 | 程式整個執行期間 |
new/delete、malloc/free 手動控制unique_ptr, shared_ptr)、容器(vector, string)自動管理.data 區.bss 區(載入時歸零)"hello"、const 修飾物件常駐此區| 變數類型 | 允許初始化運算式 | 未初始化預設值 |
|---|---|---|
| 區域變數 | 任意型別相容運算式 | 不確定值(垃圾值) |
| 全域/靜態變數 | 僅常數運算式 | 0(位元全零) |
// 全域變數
double pi = 3.14 + 0.0016; // 合法:常數運算式
double pi = acos(-1.0); // 非法:acos 非 constexpr(C++17 前)
// 區域變數
double pi = acos(-1.0); // 合法:執行期計算
鐵律:區域變數使用前必須賦值,否則引入不可預測 Bug。
std::vector、std::string、std::array 自動管理生命週期std::make_unique、std::make_shared 替代裸 newconstexpr、const 讓編譯器優化並防護修改五大記憶體區域各司其職:堆疊高效服務函式呼叫,堆提供靈活動態空間,全域/靜態/常數區支撐程式級狀態。理解初始化規則差異、生命週期邊界、現代管理工具,是從 C++ 初學者邁向系統級工程師的必經之路。