cs50 拼写器 "unload" 内存泄漏
cs50 speller "unload" memory leak
我的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 可能有问题也可能没有问题(它可能只是使用了与你不同版本的 Valgrind,如果 check50 在其他机器上是 运行),但你仍然应该删除 free(pointer)
行。
而且 Yunnosch 的评论是正确的:您不需要检查 table[i] != NULL
;当 pointer
为 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;
}
我的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 可能有问题也可能没有问题(它可能只是使用了与你不同版本的 Valgrind,如果 check50 在其他机器上是 运行),但你仍然应该删除 free(pointer)
行。
而且 Yunnosch 的评论是正确的:您不需要检查 table[i] != NULL
;当 pointer
为 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;
}