为什么我的CS50 speller项目代码存在内存泄漏及Valgrind报错?
问题原因
- 内存泄漏核心问题:
unload函数中的return true放在了for循环体内,仅会完成第0个哈希桶的节点释放就直接返回,剩余N-1个桶的节点完全没有被释放,导致大量已分配内存未被回收。 - Valgrind未初始化值报错原因:
- 哈希表
table数组初始化时未将所有元素赋值为NULL,空桶对应的table[i]为随机垃圾值,第116行的while (table[i] != NULL)判断会访问未初始化内存。 - 若
malloc创建新节点时未显式初始化next指针,节点挂载到链表后也会出现未初始化指针访问问题。
- 哈希表
修复方案
- 调整
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;
- 哈希表初始化阶段显式将所有桶赋值为
NULL:
// 哈希表声明后执行初始化 for (int i = 0; i < N; i++) { table[i] = NULL; }
- 补全
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
相关产品推荐
相关产品推荐

