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

CS50 pset5 Speller valgrind测试失败:dictionary.c malloc内存仍可到达求助

问题解决思路

首先明确valgrind提示的still reachable类型内存泄漏,本质是程序退出前没有释放所有通过malloc申请的堆内存,结合你给出的代码,问题点和修复方案如下:

  • 语法错误修复:补全文件打开失败分支的右花括号
    你给出的load函数中,if (f == NULL)的判断分支缺少闭合的右花括号,会导致后续变量定义、单词读取逻辑都被归到这个分支下,只有文件打开失败时才会执行,完全不符合预期。修复代码如下:
    if (f == NULL)
    {
        unload();
        return 1;
    } // 此处补上缺失的右花括号
    
  • 核心问题:unload函数未正确释放所有链表节点
    你load函数中malloc申请的所有节点都被挂载到了全局哈希表table的链表上,内存泄漏的根源是你实现的unload函数没有遍历所有链表节点完成释放,标准的unload实现逻辑如下:
    1. 遍历哈希表的每一个索引位置
    2. 对每个索引对应的链表,逐个遍历节点:先暂存下一个节点的指针,再释放当前节点,避免访问已释放的非法内存
      参考实现:
    bool unload(void)
    {
        // N为哈希表的总桶数,和你定义的全局常量保持一致
        for (int i = 0; i < N; i++)
        {
            node *cursor = table[i];
            while (cursor != NULL)
            {
                node *tmp = cursor;
                cursor = cursor->next;
                free(tmp);
            }
            table[i] = NULL;
        }
        return true;
    }
    
  • 冗余代码清理
    你在load函数中对新节点赋值n->next = NULL后,紧接着又通过n->next = table[index]覆盖了这个值,这行n->next = NULL是无效代码,可以直接删除,不影响逻辑。

内容的提问来源于stack exchange,提问作者Agata

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:51:04