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.
得到这种消息
这是一个相当简单的问题。
在我的学校,我们使用远程 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.
得到这种消息