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 等工具检测内存泄漏。