You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言内存泄漏问题:释放哈希表后仍存在指针泄漏

内存泄漏原因分析及修复方案

核心泄漏点

你代码里的初始malloc完全多余,且未被释放:

node *cur = malloc(sizeof(node));
node *next_node = malloc(sizeof(node));

这两行申请的内存,在后续代码里直接被cur = table[i]和next_node = cur->next覆盖,原来malloc出来的内存地址丢失,根本没机会调用free释放,这就是内存泄漏的直接原因。

其他问题

  1. 空指针访问:代码末尾printf("cur, next, %s,%s",cur->word,next_node->word);执行时,cur和next_node已经被置为NULL,访问NULL->word属于未定义行为,大概率会导致程序崩溃。
  2. 释放逻辑冗余:每次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:45:58