首页 > 解决方案 > 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;
}

标签: cmemory-leaksvalgrindcs50

解决方案


在对循环进行一些思考之后,您可以确定在您进行free(pointer)调用时,pointer它已经为 NULL。您不能解除分配 NULL 指针。

得知 Valgrind 可以发现该错误我不会感到惊讶,但它没有发现我也不会感到惊讶。这并不完美。check50 可能有问题,也可能没有问题(如果 check50 在其他机器上运行,它可能只是使用与您不同的 Valgrind 版本),但您仍然应该删除该free(pointer)行。

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


推荐阅读