动态内存分配
从 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 等工具检测内存泄漏。