返回介绍

推敲证据

发布于 2024-10-10 23:21:29 字数 1835 浏览 0 评论 0 收藏 0

好了,既然你已经用

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文