valgrind 和系统的区别(“泄漏 a.out”)

Difference between valgrind and system("leaks a.out")

提问人:yigidinho 提问时间:4/2/2023 最后编辑:yigidinho 更新时间:4/3/2023 访问量:318

问:

在我看来,在 C 语言中,内存管理和内存泄漏是最令人困惑的话题之一。最常用的控制方法是 valgrind。但是,我的课程中使用了 Mac 计算机,在这些计算机上使用了功能系统(“leaks a.out”),而不是 valgrind。我在家里自己的电脑上尝试了这两种方法,该电脑有 Windows 和 Ubuntu 操作系统,并比较了结果。我得到了不同的结果,因为 valgrind 甚至显示了最小的泄漏,而使用 system(“leaks a.out”) 功能,我只获得了特定代码中的泄漏。

我还搜索了许多来源,但找不到有关如何使用系统(“leaks a.out”)功能的任何来源。熟悉这个函数使用的人可以解释为什么我得到了不同的结果吗?我以为我知道内存泄漏,但是在发现系统(“leaks a.out”)功能后,我所知道的一切都混淆了。

结果,这是总结:我尝试了这个函数(system(“leaks a.out”))和程序(valgrind)。我期望得到相同的结果,但得到了不同的结果。因为泄漏就是泄漏,所以一定不能改变,对吧?

C 内存泄漏 malloc 系统 valgrind

评论

1赞 Eugene Sh. 4/2/2023
system("leaks a.out");只是一个实际调用shell命令的函数,而只是一个命令行工具,你可以找到如何使用它来调用。system()> leaks a.outleaksvalgrindman leaks
2赞 Blindy 4/2/2023
“内存管理和内存泄漏是最令人困惑的话题之一” -- 需要引用。
0赞 Shawn 4/2/2023
并非所有内存错误检测方法都是一样的?
0赞 yigidinho 4/2/2023
我想做一个有效的介绍,但我用错了句子,在表达自己的观点时用笼统的表达方式代表大家发言,所以我编辑了那部分。现在,如果一切正常,你能给我建议吗?@Blindy
0赞 yigidinho 4/2/2023
感谢您的评论,我试过了,但是当我写“泄漏”或“人泄漏”时,我的终端显示“找不到命令”。现在我正在研究它,我如何安装它。@EugeneSh。

答:

0赞 Paul Floyd 4/3/2023 #1

不是所有人都平等?有点。

如果该工具可以看到对分配和取消分配的所有调用,那么泄漏检测就相当简单。

在某些情况下,工具无法获得所需的所有信息。

  1. 如果该工具没有从一开始就开始录制。例如,可以附加到 PID。不会跟踪在附加之前分配的内存。leaks
  2. 用户定义的分配函数。通常,这些需要注释才能被工具识别,否则无法检测到泄漏。

当然,工具也总是有错误的可能性。

大多数工具还具有某种抑制机制(具有一组默认抑制)。可能正是这一点导致了你所看到的不同。

使用 -s 运行 Valgrind 以查看它正在使用哪些抑制。