推敲证据
好了,既然你已经用
valgrind 收集了不少证据,下面就来分析这些证据,看看能否得出什么结论。
- 定位
运行了两次代码,第一次没有任何问题。只有当输入一个新嫌疑犯的名字时,存储器才会泄漏。这条线索十分重要,因为它说明泄漏不可能发生在第一次运行的代码中。回过去看源代码,问题应该发生在以下代码中:
} else if (current->no) { current = current->no;} else { /* Make the yes-node the new suspect name */ printf("Who's the suspect? "); fgets(suspect, 20, stdin); node *yes_node = create(suspect); current->yes = yes_node; /* Make the no-node a copy of this question */ node *no_node = create(current->question); current->no = no_node; /* Then replace this question with the new question */ printf("Give me a question that is TRUE for %s but not for %s? ", suspect, current->question); fgets(question, 80, stdin); current->question = strdup(question); break;}
valgrind 提供的线索
当用
valgrind 运行代码并添加一名嫌疑犯时,程序分配了 11 次存储器,但只释放了 10 次,这说明什么?
valgrind 告诉你程序结束时有 19 个字节的数据留在了堆上。看一下源代码,哪条数据像是有 19 字节?
最后,下面这段 valgrind 的输出告诉你什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论