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

CS50 PSET4 Speller拼写检查器内存泄漏问题求助

CS50 Speller 内存泄漏问题排查与解决

核心问题定位

从现象来看:无拼写错误的文本检测无内存泄漏,但检测含错误文本时泄漏触发,说明内存泄漏仅发生在处理错误单词的代码路径中,大概率是check函数内的临时动态内存未释放,或是unload函数对字典结构的释放逻辑存在场景化遗漏。

常见修复方案

1. 确保check函数的临时内存全路径释放

如果你的check函数为处理单词(如转小写)分配了动态内存,必须保证无论单词是否存在于字典中,这块内存都被释放。比如常见的错误写法是仅在单词存在时释放,错误单词路径漏释放:

bool check(const char *word)
{
    // 分配临时内存存储转小写后的单词
    char *lower_word = malloc(strlen(word) + 1);
    if (lower_word == NULL)
    {
        return false;
    }

    // 转小写逻辑
    for (int i = 0; word[i] != '\0'; i++)
    {
        lower_word[i] = tolower(word[i]);
    }
    lower_word[strlen(word)] = '\0';

    // 查找字典逻辑
    bool exists = false;
    node *cursor = table[hash(lower_word)];
    while (cursor != NULL)
    {
        if (strcmp(cursor->word, lower_word) == 0)
        {
            exists = true;
            break;
        }
        cursor = cursor->next;
    }

    // 关键:无论exists结果如何,都要释放临时内存
    free(lower_word);
    return exists;
}

这个场景完全匹配你的问题:无错误文本时所有单词都能查到,若之前只在exists = true分支释放,错误单词路径就会泄漏内存。

2. 校验unload函数的哈希表遍历完整性

如果字典用哈希表实现,unload必须遍历所有哈希桶,逐个释放链表节点:

bool unload(void)
{
    // 遍历全部哈希桶,不能只遍历部分
    for (int i = 0; i < N; i++)
    {
        node *cursor = table[i];
        while (cursor != NULL)
        {
            node *temp = cursor;
            cursor = cursor->next;
            free(temp);
        }
        // 可选:将桶置空,避免野指针
        table[i] = NULL;
    }
    return true;
}

若循环范围错误(比如用了错误的桶数量)或链表释放逻辑断链,可能在特定场景下导致节点未释放,但这种情况一般不会只在错误文本时触发,优先级低于第一种情况。

3. 利用Valgrind日志精准定位

从你的Valgrind日志中找到definitely lost条目对应的代码行,比如:

12345 16 bytes in 1 blocks are definitely lost in loss record 1 of 1
12345 at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
12345 by 0x109234: check (dictionary.c:45)
12345 by 0x108E21: main (speller.c:112)
这条日志直接指出泄漏发生在check函数第45行的malloc操作,针对性修复即可。

验证步骤

修复后,用Valgrind重新测试含错误单词的文本:

valgrind --leak-check=full ./speller texts/misspelled.txt

若输出All heap blocks were freed -- no leaks are possible,则问题解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 12:03:16