langShiftlangShift

動態記憶體分配

從 JavaScript 視角學習 C 語言動態記憶體分配,理解 malloc、free、記憶體洩漏,並對比 JavaScript 垃圾回收機制。

動態記憶體分配

1. 概念介紹

從 JavaScript 垃圾回收到 C 手動記憶體管理

在 JavaScript 中,記憶體管理是自動的 - 垃圾回收器會自動釋放未使用的記憶體。而在 C 語言中,你必須手動使用 malloc()calloc()realloc()free() 等函數來分配和釋放記憶體。

💡 核心概念:C 的手動記憶體管理給你精確的控制權,但需要仔細注意以防止記憶體洩漏和未定義行為。

2. 基礎記憶體分配

正在加载...

3. 進階記憶體函數

正在加载...

4. 記憶體洩漏和預防

正在加载...

5. 常見陷阱

  • 記憶體洩漏:忘記呼叫 free()
  • 重複釋放:對已釋放的記憶體再次呼叫 free()
  • 懸空指標:釋放記憶體後仍使用指標
  • 緩衝區溢位:寫入超出分配記憶體的範圍
  • 空指標解參考:未檢查 malloc() 是否返回 NULL

6. 練習題

  1. 撰寫一個函數,為字串分配記憶體,複製給定字串到其中,並返回指標。記得稍後釋放它。
  2. 建立一個函數,動態分配二維陣列並用值初始化它。
  3. 撰寫一個程式,透過追蹤分配和釋放來示範記憶體洩漏檢測。

7. 效能分析

  • 手動記憶體管理可能比垃圾回收更高效
  • 頻繁的分配/釋放可能導致記憶體碎片
  • 記憶體池可以提高小規模頻繁分配的性能
  • 適當的記憶體管理對長時間執行的應用程式至關重要

小結:C 的手動記憶體管理提供控制和性能,但需要紀律性。始終將 malloc()free() 配對,檢查分配失敗,並使用 Valgrind 等工具檢測記憶體洩漏。