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实现逻辑如下:- 遍历哈希表的每一个索引位置
- 对每个索引对应的链表,逐个遍历节点:先暂存下一个节点的指针,再释放当前节点,避免访问已释放的非法内存
参考实现:
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
相关产品推荐
相关产品推荐

