C语言内存泄漏问题:释放哈希表后仍存在指针泄漏
内存泄漏原因分析及修复方案
核心泄漏点
你代码里的初始malloc完全多余,且未被释放:
node *cur = malloc(sizeof(node)); node *next_node = malloc(sizeof(node));
这两行申请的内存,在后续代码里直接被cur = table[i]和next_node = cur->next覆盖,原来malloc出来的内存地址丢失,根本没机会调用free释放,这就是内存泄漏的直接原因。
其他问题
- 空指针访问:代码末尾
printf("cur, next, %s,%s",cur->word,next_node->word);执行时,cur和next_node已经被置为NULL,访问NULL->word属于未定义行为,大概率会导致程序崩溃。 - 释放逻辑冗余:每次
free后把cur置为NULL没问题,但初始的malloc完全没必要——指针不需要提前分配内存,直接声明未初始化的指针即可。
修复后的代码
bool unload(void) { // 直接声明空指针,无需提前malloc node *cur = NULL; node *next_node = NULL; // 遍历哈希表所有桶 for (int i = 0; i < N; i++) { if (table[i] != NULL) { cur = table[i]; // 循环释放链表节点 while (cur != NULL) { next_node = cur->next; free(cur); cur = next_node; } // 可选:将桶的表头置为NULL,避免后续误操作野指针 table[i] = NULL; } } return true; }
修复说明
- 移除无意义的初始
malloc,从根源避免内存泄漏。 - 简化释放逻辑:先保存下一个节点地址,再释放当前节点,循环直到
cur为NULL,逻辑更简洁可靠。 - 可选将
table[i]置为NULL,防止后续代码误访问已释放的内存(野指针)。
内容的提问来源于stack exchange,提问作者Yuhang Peng
相关产品推荐
相关产品推荐

