c - 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)
行。
Yunnosch 的评论是正确的:你不需要检查 if table[i] != NULL
; 当为NULL 时,它将始终pointer
为 NULL。
推荐阅读
- r - sparklyr + lm 带有分类预测器
- python - linalg.solve() 迭代字典
- python - 如何从文本中提取表情符号,然后将它们添加到新列?
- api - 从 cuckoo.cert.ee 中提取 api 调用
- python - python3:赋值前引用的局部变量
- pytorch - 自回归变压器解码的内存瓶颈
- cassandra - Cassandra 中 memtable 的红黑树键使用什么?
- javascript - 画布中的对象没有以相同的大小加载-fabric.js loadFromJSON
- parsing - 使用 using 语句在 Stata 程序中拆分或标记?
- json - 如何在 react 和 styled-components 中使用 json 文件切换主题?