CS50 pset5 speller程序无内存错误但valgrind测试失败问题求助
问题原因分析
存在两个核心错误:
- 内存未完全释放(直接导致valgrind报错)
你当前的unload函数只释放了每个哈希桶的第一个节点,桶下挂载的链表所有后续节点都没有被释放,就会出现你看到的“内存块仍可到达”的泄漏报错。你测试用的字典里有2个单词,正好对应valgrind报告里的2块未释放内存。 - 哈希表桶数配置错误
你定义的哈希桶数量N = 1,但你的hash函数返回的是首字母大写后减'A',返回值范围是0~25,当单词首字母不是A的时候,hash返回的下标会超过数组table的边界,直接导致数组越界访问,出现不可预知的运行错误。
修复方案
1. 重写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); } } return true; }
2. 调整哈希桶数量匹配哈希函数逻辑
把N的定义改成至少26,匹配你当前hash函数的返回范围:
const unsigned int N = 26;
修改完上述两处问题后,valgrind的内存泄漏报错会消失,数组越界的潜在风险也会被解决。
内容的提问来源于stack exchange,提问作者aw_codes
相关产品推荐
相关产品推荐

