You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Valgrind检测C语言动态分配程序存在still reachable内存问题

问题根因定位
  1. 首先你的Valgrind运行方式错误:你直接将C源码文件main.c当作可执行文件运行,才会出现语法错误提示。正确执行流程为:
# 先编译源码生成可执行文件
gcc main.c -o reverse_demo
# 再用Valgrind检测可执行文件
valgrind --leak-check=full ./reverse_demo test.txt
  1. 核心内存泄漏原因:reverse 函数内部通过malloc申请了堆内存并返回,你在调用reverse输出结果后,没有释放这块返回的内存,这就是still reachable内存的来源。
修复步骤
  1. 替换所有调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:45:04