Valgrind 显示内存泄漏但没有发生内存分配

Valgrind shows memory leak but no memory allocation took place

这是一个相当简单的问题。

在我的学校,我们使用远程 CentOS 服务器来编译和测试我们的程序。出于某种原因,valgrind 总是显示 4096B 泄漏,尽管事实上没有使用 malloc。这里有人知道这个问题可能源于哪里吗?

您的程序调用了 printf。该库可能会为其自己的使用分配内存。更一般地说,根据 OS/libc/...,可能只是为了启动程序而进行各种分配。

另请注意,在这种情况下,您会看到在退出时仍分配了一个块,并且该块是抑制计数的一部分。这意味着 valgrind 抑制文件已经确保此内存不会出现在要检查的泄漏列表中。

总结:没问题。

无论如何,当您怀疑有泄漏时,您可以查看泄漏的详细信息,例如他们的分配堆栈跟踪以查看这些是否由您的应用程序触发。

除了@phd 的回答之外,您还可以做一些事情来更清楚地了解发生了什么。

如果您 运行 Valgrind 使用 -s-v,它将显示所用抑制的详细信息。

您可以使用 --trace-malloc=yes 查看所有对分配函数的调用(仅对小型应用程序执行此操作)。同样,您可以 运行 和 --default-suppressions=no 然后您将看到内存的详细信息(在这种情况下为 --leak-check=full --show-reachable=yes

最后,您使用的是旧的 Centos / GNU libc 吗?几年前,Valgrind 有了一种机制来清理像 io 缓冲区这样的东西,所以你不应该用最近的 Valgrind 和最近的 Linux + libc.

得到这种消息