CS50拼写器“卸载”内存泄漏

问题描述

我的cs50拼写函数终于可以使用了,但是当将它输入到check50中时,它说Valgrind存在内存错误。这是我的卸载功能,应该可以释放以前分配的所有内存。

bool unload(void)
{
    for (int i = 0; i < N; i++)
    {
        node *pointer = table[i];

        while (table[i] != NULL && pointer != NULL)
        {
            node *tmp = pointer;
            pointer = pointer->next;
            free(tmp);
        }
        free(pointer);
    }

    return true;
}

解决方法

仔细研究一下循环,您可以确定到进行free(pointer)调用时,pointer已经为NULL。您不能取消分配NULL指针。

得知Valgrind可以找到该错误,我不会感到惊讶,但也不会惊讶。这不是完美的。而且check50可能有或没有问题(如果check50在其他计算机上运行,​​则可能使用的Valgrind版本与您使用的版本不同),但是您仍然应该删除free(pointer)行。 / p>

Yunnosch的评论是正确的:您不需要检查table[i] != NULLpointer为NULL时,它将始终为NULL。

,
bool unload(void)

for (int i = 0; i < N; i++)
{
    node *pointer = table[i];

    while (pointer)
    {
        node *tmp = pointer;
        pointer = pointer->next;
        free(tmp);
    }
}

return true;

}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...