C++ 程式執行時,記憶體邏輯上劃分為五大區域,各有獨特管理機制與生命週期:
| 區域 | 分配方式 | 釋放方式 | 典型內容 |
|---|---|---|---|
| 堆 | new / malloc | 程式設計師手動 delete / free,程式結束由 OS 回收 | 動態分配物件、大型緩衝區 |
| 棧 | 編譯器自動 | 離開作用域自動銷毀 | 區域變數、函數參數、返回位址 |
| 自由儲存區 | malloc/calloc/realloc | free | C 風格動態記憶體,與堆相似但管理 API 不同 |
| 全域/靜態區 | 程式啟動時 | 程式結束時 | 全域變數、static 變數(含類別靜態成員) |
| 常數區 | 編譯期決定 | 程式結束時 | 字串常值、const 全域/靜態變數 |
概念重疊但非完全等同:new 分配於「自由儲存區」,標準未強制其等同於 C 的堆。實務上多視為同義,但嚴格區分有助於理解 ::operator new 與 malloc 的差異。
早期 C++ 區分初始化/未初始化全域變數(BSS vs DATA 段),現代 C++ 統一管理。static 區域變數雖儲存於此,但作用域侷限於函數/檔案內。
儲存字串常值(如 "hello")與 const 修飾的全域/靜態變數。嚴禁修改,違反導致未定義行為(雖可透過 const_cast 強制,但極度危險)。
文章提及 Windows 服務(後台無互動程式)開發建議:
std::vector、std::string、std::unique_ptr、std::shared_ptr 等 RAII 類型new/delete、malloc/free=default/=delete 明確語意深入理解記憶體佈局,是寫出高效、安全 C++ 程式的前提,也是系統級開發、效能調優的核心竭力所在。