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

CS50 Speller代码Check50全绿但Valgrind检测出内存泄漏的疑问

问题解答

既不是Check50的检测算法存在bug,也不是该程序允许存在内存泄漏。

  • Check50的测试用例可能刚好覆盖的是哈希表每个链表节点数≤2的场景,这时候你的unload函数能刚好释放所有分配的内存,所以内存检测项显示通过(全绿)。但这只是Check50的测试场景有限,并非你的程序没有内存问题。
  • Valgrind能精准检测所有未释放的堆内存,当你的测试输入导致哈希表中出现节点数超过2的链表时,unload函数只释放前2个节点的逻辑就会遗漏后续节点,从而触发内存泄漏报错。
  • CS50 Speller的要求是必须完全释放所有动态分配的内存,不允许存在任何内存泄漏。你的问题出在unload函数的逻辑错误,没有完整遍历并释放链表的所有节点。

修复建议:修改unload函数,用循环遍历每个链表的全部节点——每次用临时指针保存当前节点的下一个节点,释放当前节点后,再移动到下一个节点,直到链表为空。比如:

bool unload(void)
{
    for (int i = 0; i < N; i++)
    {
        node *cursor = table[i];
        while (cursor != NULL)
        {
            node *temp = cursor->next;
            free(cursor);
            cursor = temp;
        }
        table[i] = NULL;
    }
    return true;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:53:18