動態記憶體分配
從 JavaScript 視角學習 C 語言動態記憶體分配,理解 malloc、free、記憶體洩漏,並對比 JavaScript 垃圾回收機制。
動態記憶體分配
1. 概念介紹
從 JavaScript 垃圾回收到 C 手動記憶體管理
在 JavaScript 中,記憶體管理是自動的 - 垃圾回收器會自動釋放未使用的記憶體。而在 C 語言中,你必須手動使用 malloc()
、calloc()
、realloc()
和 free()
等函數來分配和釋放記憶體。
💡 核心概念:C 的手動記憶體管理給你精確的控制權,但需要仔細注意以防止記憶體洩漏和未定義行為。
2. 基礎記憶體分配
正在加载...
3. 進階記憶體函數
正在加载...
4. 記憶體洩漏和預防
正在加载...
5. 常見陷阱
- 記憶體洩漏:忘記呼叫
free()
- 重複釋放:對已釋放的記憶體再次呼叫
free()
- 懸空指標:釋放記憶體後仍使用指標
- 緩衝區溢位:寫入超出分配記憶體的範圍
- 空指標解參考:未檢查
malloc()
是否返回 NULL
6. 練習題
- 撰寫一個函數,為字串分配記憶體,複製給定字串到其中,並返回指標。記得稍後釋放它。
- 建立一個函數,動態分配二維陣列並用值初始化它。
- 撰寫一個程式,透過追蹤分配和釋放來示範記憶體洩漏檢測。
7. 效能分析
- 手動記憶體管理可能比垃圾回收更高效
- 頻繁的分配/釋放可能導致記憶體碎片
- 記憶體池可以提高小規模頻繁分配的性能
- 適當的記憶體管理對長時間執行的應用程式至關重要
小結:C 的手動記憶體管理提供控制和性能,但需要紀律性。始終將
malloc()
與free()
配對,檢查分配失敗,並使用 Valgrind 等工具檢測記憶體洩漏。