在C语言中,内存管理和内存泄漏是我认为最容易混淆的话题。最常用的控制方法是 valgrind。然而,在我的课程中使用的是 Mac 计算机,并且在这些计算机上使用函数 system("leaks a.out") 而不是 valgrind。我在家里有 Windows 和 Ubuntu 操作系统的电脑上尝试了这两种方法,并比较了结果。我得到了不同的结果,因为 valgrind 甚至显示了最小的泄漏,而使用 system("leaks a.out") 函数,我只获得了特定代码中的泄漏。
我还搜索了许多资源,但找不到有关如何使用 system("leaks a.out") 函数的任何资源。熟悉此功能使用的人可以解释为什么我得到不同的结果吗?我以为我知道内存泄漏,但在发现 system("leaks a.out") 函数后,我所知道的一切都搞混了。
结果,这是总结:我尝试了这个函数(系统(“泄漏a.out”))和程序(valgrind)。我期待相同的结果,但得到了不同的结果。因为漏就是漏,总不能改了吧?
不都一样吗?有点。
如果该工具可以看到所有对分配和释放的调用,那么泄漏检测就相当简单了。
在某些情况下,工具无法获得所需的所有信息。
leaks
可以附加到 PID。在附加之前分配的内存将不会被跟踪。当然,工具也总是有bug的可能。
大多数工具也有某种抑制机制(有一组默认抑制)。这可能会导致您所看到的有所不同。
使用 -s 运行 Valgrind 以查看它使用了哪些抑制。