Valgrind检测C语言动态分配程序存在still reachable内存问题
问题根因定位
- 首先你的Valgrind运行方式错误:你直接将C源码文件
main.c当作可执行文件运行,才会出现语法错误提示。正确执行流程为:
# 先编译源码生成可执行文件 gcc main.c -o reverse_demo # 再用Valgrind检测可执行文件 valgrind --leak-check=full ./reverse_demo test.txt
- 核心内存泄漏原因:
reverse函数内部通过malloc申请了堆内存并返回,你在调用reverse输出结果后,没有释放这块返回的内存,这就是still reachable内存的来源。
修复步骤
- 替换所有调用
reverse的代码逻辑,先接收返回的字符串指针,输出完成后手动释放:
原有代码:
printf("%s\n", reverse(alllines[i]));
修改为:
char* reversed_str = reverse(alllines[i]); printf("%s\n", reversed_str); free(reversed_str);
两处调用位置都要修改:分别是读取标准输入的循环、读取文件的循环内的打印逻辑。
2. 补充额外优化点(可选,避免潜在问题):
- 不要手动关闭标准输入
stdin,在fclose(fp)前加判断:
if(fp != stdin) { fclose(fp); }
reverse函数内已经计算过len = strlen(s),malloc时直接用len + 1即可,无需重复调用strlen(s)减少冗余计算。
验证结果
修改完成后重新编译运行Valgrind检测,所有堆内存都会被正确释放,不会再出现still reachable的提示。
内容的提问来源于stack exchange,提问作者SnowballAvocado
相关产品推荐
相关产品推荐

