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
相关产品推荐
相关产品推荐

