「640K ought to be enough for everybody」 — Bill Gates, 1981
記憶體管理是雷區,**唯有發現並排除所有地雷才能安全通行**。本章深度遠超普通教材,請精讀。
| 方式 | 區域 | 生命週期 | 範例 |
|---|---|---|---|
| 靜態儲存區 | .data/.bss | 程式全程 | 全域變數、static 變數 |
| 堆疊 | Stack | 函數呼叫期間 | 區域變數、函數參數 |
| 堆積 | Heap | 程式設計師控制 | malloc/new 分配,free/delete 釋放 |
| 錯誤 | 成因 | 鐵律對策 |
|---|---|---|
| 分配失敗卻使用 | 新手以為分配必成功 | 規則 7-2-1:用前必檢 if(p==nullptr);參數用 assert(p!=nullptr) |
| 未初始化即引用 | 無初始化觀念 / 以為預設為 0 | 規則 7-2-2:無論何種方式建立陣列,**必賦初值** (哪怕是 0) |
| 越界操作 | 下標「多 1」或「少 1」,for 迴圈易出錯 | 規則 7-2-3:避免越界,特別警惕 ±1 |
| 忘記釋放 → 記憶體洩漏 | 動態分配/釋放次數不等 | 規則 7-2-4:malloc/free、new/delete **次數必等** |
| 釋放後繼續使用 | 物件關係複雜/返回棧指標/釋放未置空 | 規則 7-2-5:free/delete 後**立即置 nullptr**,防野指標 |
下節將以字串為例深度對比。