提问人:yigidinho 提问时间:4/2/2023 最后编辑:yigidinho 更新时间:4/3/2023 访问量:318
valgrind 和系统的区别(“泄漏 a.out”)
Difference between valgrind and system("leaks a.out")
问:
在我看来,在 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)。我期望得到相同的结果,但得到了不同的结果。因为泄漏就是泄漏,所以一定不能改变,对吧?
答:
0赞
Paul Floyd
4/3/2023
#1
不是所有人都平等?有点。
如果该工具可以看到对分配和取消分配的所有调用,那么泄漏检测就相当简单。
在某些情况下,工具无法获得所需的所有信息。
- 如果该工具没有从一开始就开始录制。例如,可以附加到 PID。不会跟踪在附加之前分配的内存。
leaks
- 用户定义的分配函数。通常,这些需要注释才能被工具识别,否则无法检测到泄漏。
当然,工具也总是有错误的可能性。
大多数工具还具有某种抑制机制(具有一组默认抑制)。可能正是这一点导致了你所看到的不同。
使用 -s 运行 Valgrind 以查看它正在使用哪些抑制。
评论
system("leaks a.out");
只是一个实际调用shell命令的函数,而只是一个命令行工具,你可以找到如何使用它来调用。system()
> leaks a.out
leaks
valgrind
man leaks