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

时间:2020-08-15 22:00:00

标签: c memory-leaks valgrind 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;
}

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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;

}