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

为什么我的CS50 speller项目代码存在内存泄漏及Valgrind报错?

问题原因
  • 内存泄漏核心问题:unload函数中的return true放在了for循环体内,仅会完成第0个哈希桶的节点释放就直接返回,剩余N-1个桶的节点完全没有被释放,导致大量已分配内存未被回收。
  • Valgrind未初始化值报错原因:
    1. 哈希表table数组初始化时未将所有元素赋值为NULL,空桶对应的table[i]为随机垃圾值,第116行的while (table[i] != NULL)判断会访问未初始化内存。
    2. 若malloc创建新节点时未显式初始化next指针,节点挂载到链表后也会出现未初始化指针访问问题。
修复方案
  1. 调整unload函数返回逻辑,将return true移到for循环外,确保所有哈希桶的节点都被释放,修复后代码如下:
for (int i = 0; i < N; i++)
{
    //line 116 
    while (table[i] != NULL)
    {
        node *tmp = table[i]->next;
        free(table[i]);
        table[i] = tmp;
    }
}
// 所有内存释放完成后再返回
return true;
  1. 哈希表初始化阶段显式将所有桶赋值为NULL:
// 哈希表声明后执行初始化
for (int i = 0; i < N; i++)
{
    table[i] = NULL;
}
  1. 补全malloc创建节点的逻辑,显式初始化next指针,同时增加内存分配失败的异常处理:
while(fscanf(file, "%s", word) != EOF)
{
    node *newNode = malloc(sizeof(node));
    if (newNode == NULL)
    {
        unload();
        return false;
    }
    strcpy(newNode->word, word);
    // 初始化next指针避免野指针
    newNode->next = NULL;
    // 原有将节点挂载到对应哈希桶的逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:06:04