C语言中内存泄漏的常见原因和检测方法有哪些?
常见内存泄漏原因:
-
未释放动态分配的内存
cvoid leak_example() { int *ptr = malloc(sizeof(int) * 100); // 忘记调用 free(ptr) } -
重复释放导致的双重释放
cint *ptr = malloc(sizeof(int)); free(ptr); free(ptr); // 未定义行为 -
指针覆盖导致原内存无法释放
cint *ptr = malloc(sizeof(int) * 10); ptr = malloc(sizeof(int) * 20); // 原内存泄漏 -
循环引用中的内存泄漏
- 结构体相互引用形成闭环
- 引用计数无法归零
-
异常处理路径未释放内存
- 函数中途返回忘记释放
- 错误处理分支遗漏 free 调用
检测方法:
-
Valgrind 工具
bashvalgrind --leak-check=full --show-leak-kinds=all ./program -
AddressSanitizer
bashgcc -fsanitize=address -g program.c -o program -
代码审查
- 检查所有 malloc/calloc/realloc 是否有对应 free
- 审查所有函数返回路径的内存释放情况
预防措施:
- 使用 RAII 模式(C++风格)
- 建立内存分配释放配对检查机制
- 使用智能指针封装(C++)
- 定期进行内存分析工具检查