程式記憶體五大區域
| 區域 | 別名 | 管理方式 | 存放內容 | 生命週期 |
| 棧區 | Stack | 編譯器自動配置/釋放 | 函式參數、區域變數、返回位址 | 函式呼叫期間 (LIFO) |
| 堆區 | Heap | 程式設計師手動 malloc/free 或 new/delete | 動態配置記憶體 | 手動控制,程式結束時 OS 回收 |
| 全域/靜態區 | Data/BSS | 系統自動管理 | 全域變數、static 變數 (初始化/未初始化分段) | 程式啟動到結束 |
| 常數區 | 文字常數區 | 系統自動管理 | 字串常數、const 修飾的全域/靜態變數 | 程式啟動到結束 (通常唯讀) |
| 程式碼區 | Text/Code | 系統自動管理 | 函式機器碼、二進制指令 | 程式啟動到結束 (通常唯讀) |
六大經典記憶體錯誤與對策
| # | 錯誤類型 | 原因 | 對策 |
| 1 | 配置失敗卻使用 | 未檢查 malloc/new 回傳值 | 使用前檢查 NULL,assert(p != NULL) |
| 2 | 未初始化就引用 | 無初始化習慣、誤以為預設為 0 | 永遠初始化,即使歸零也要寫出來 |
| 3 | 越界存取 | 陣列下標「多 1」或「少 1」,迴圈邊界錯誤 | 邊界檢查、使用 std::vector::at()、靜態分析工具 |
| 4 | 記憶體洩漏 | 配置後未釋放、malloc/free 次數不匹配 | 配置釋放配對、RAII、智慧指標、Valgrind/AddressSanitizer 檢測 |
| 5 | 釋放後繼續使用 (野指標) | 物件生命週期複雜、回傳棧區指標、free 後未歸零 | 釋放後 p = nullptr、避免回傳區域物件位址、弱指標打破循環參考 |
| 6 | 指標強制轉型不匹配 | reinterpret_cast、void* 濫用 | 避免 C 風格轉型、使用 static_cast/dynamic_cast、型別安全設計 |
記憶體使用六大鐵律
- 檢查配置結果:
malloc/new 後立即檢查 NULL
- 必須初始化:陣列、動態記憶體使用前賦初值
- 防止越界:特別注意迴圈「差一」錯誤
- 配置釋放配對:
malloc/free、new/delete、new[]/delete[] 嚴格成對
- 釋放即歸零:
free(p); p = NULL; / delete p; p = nullptr;
- 善用工具:Valgrind、AddressSanitizer、靜態分析 (Cppcheck、Clang-Tidy)
指標 vs 陣列:本質差異
| 特性 | 陣列 | 指標 |
| 儲存位置 | 靜態區 (全域) 或棧區 (區域) | 可指向任意區域 (堆、棧、全域、常數) |
| 記憶體佈局 | 連續、固定大小 | 指向的記憶體塊大小可變 |
| 名稱含義 | 代表整個陣列實體 (非指標) | 變數儲存位址,可隨時改變指向 |
| sizeof 結果 | 整個陣列大小 (bytes) | 指標大小 (4/8 bytes) |
| 可修改性 | 內容可改,位址/大小固定 | 位址可改,指向內容可改 |
| 靈活度 | 低 | 高 (但風險大) |
關鍵程式碼示範
// 錯誤:回傳區域陣列/物件指標
int* badFunc() {
int arr[10] = {0};
return arr; // arr 在函式結束時銷毀,回傳野指標
}
// 正確:動態配置 (呼叫端負責釋放)
int* goodFunc() {
int* arr = new int[10]();
return arr;
}
// 現代 C++:RAII 容器自動管理
std::vector bestFunc() {
return std::vector(10, 0); // 移動語意高效回傳
}
// 釋放後歸零模式
void safeFree(int** pp) {
if (pp && *pp) {
delete[] *pp;
*pp = nullptr;
}
}
現代 C++ 記憶體管理最佳實務
- 優先使用容器:
std::vector, std::string, std::array 替代原始陣列
- 智慧指標取代裸指標:
std::unique_ptr:獨佔所有權,零開銷
std::shared_ptr:共享所有權,原子引用計數
std::weak_ptr:觀察者,打破循環參考
- 避免手動 new/delete:只在實作底層資源管理類別 (RAII Wrapper) 時使用
- Placement new:記憶體池、物件復用等進階場景
總結:從 C 到現代 C++ 的演進
C 風格: malloc/free → new/delete → 智慧指標 → 容器/值語意
手動管理 配對管理 自動管理 零開銷抽象
高風險 易洩漏 強保證 現代最佳實務