cs50拼写器“;“卸载”;内存泄漏

cs50拼写器“;“卸载”;内存泄漏,c,memory-leaks,valgrind,cs50,C,Memory Leaks,Valgrind,Cs50,我的cs50拼写器功能终于起作用了,但是当它进入check50时,它说Valgrind有一个内存错误。这是我的unload函数,它应该释放以前分配的所有内存 bool unload(void) { for (int i = 0; i < N; i++) { node *pointer = table[i]; while (table[i] != NULL && pointer != NULL) {

我的cs50拼写器功能终于起作用了,但是当它进入check50时,它说Valgrind有一个内存错误。这是我的unload函数,它应该释放以前分配的所有内存

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;
}
bool卸载(无效)
{
对于(int i=0;i下一步;
免费(tmp);
}
自由(指针);
}
返回true;
}

在对循环稍作思考后,您可以确定在到达
空闲(指针)
调用时,
指针
已经为空。无法取消分配空指针

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


Yunnosch的评论是正确的:您不需要检查
表[i]!=空
;当
指针
为空时,它将始终为空。

在循环中稍作思考后,您可以确定在到达
空闲(指针)
调用时,
指针
已经为空。无法取消分配空指针

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;
如果Valgrind发现了这个错误,我不会感到惊讶,但我也不会感到惊讶。这并不完美。check50可能有问题,也可能没有问题(如果check50在其他机器上运行,它可能只是使用了与您不同的Valgrind版本),但您仍然应该删除
空闲(指针)

Yunnosch的评论是正确的:您不需要检查
表[i]!=空
;当
指针
为空时,它将始终为空。

bool unload(void)
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;
对于(int i=0;i下一步; 免费(tmp); } } 返回true;
}

bool卸载(无效)
对于(int i=0;i下一步;
免费(tmp);
}
}
返回true;

}

自己跑吧。看看报告告诉你的。需要太多的猜测。请提供一个。代码似乎释放了每个链表末尾的空指针。即
自由(指针)是不需要的。不知道Valgrind对此有何反应
,为什么
while(表[i]!=NULL&&pointer!=NULL)
而不是简单的
while(pointer!=NULL)
?您是否希望
表[i]
在某个时刻变为空?Valgrind说没有错误,所以我认为这是check50Run Valgrind自己的问题。看看报告告诉你的。需要太多的猜测。请提供一个。代码似乎释放了每个链表末尾的空指针。即
自由(指针)是不需要的。不知道Valgrind对此有何反应
,为什么
while(表[i]!=NULL&&pointer!=NULL)
而不是简单的
while(pointer!=NULL)
?你希望
表[i]
在某个时候变为空吗?Valgrind说没有错误,所以我认为这是check50的问题。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常更有帮助,质量更好,并且更有可能吸引更多的投票。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常更有帮助,质量更好,更容易吸引选票。