这是一个相当简单的问题。在我的学校里,我们使用一个远程CentOS服务器来编译和测试我们的程序。由于某种原因,尽管没有使用malloc,valgrind总是显示4096B泄漏。这里有人知道这个问题可能是从哪里来的吗?
bwleehnv1#
你的程序调用printf。这个库可能会为自己的使用分配内存。更一般地说,根据OS/libc/...,可能会为启动一个程序分配不同的内存。还请注意,在本例中,您会看到在退出时仍有一个块被分配,并且该块是抑制计数的一部分。这意味着valgrind抑制文件已经确保该内存不会出现在要检查的泄漏列表中。总之:没问题。在任何情况下,当您怀疑存在泄漏时,您都可以查看泄漏的详细信息(例如,它们的分配堆栈跟踪),以查看这些泄漏是否由您的应用程序触发。
8aqjt8rx2#
除了@phd的回答,你还可以做几件事来更清楚地看到发生了什么。如果您使用-s或-v运行Valgrind,它将显示所用抑制的详细信息。你可以使用--trace-malloc=yes来查看所有对分配函数的调用(只对小型应用程序这样做)。类似地,你可以使用--default-suppressions=no来运行,然后你会看到内存的细节(在本例中使用--leak-check=full --show-reachable=yes)最后,您使用的是旧的Centos / GNU libc吗?几年前,Valgrind提供了一种机制来清理io缓冲区之类的东西,所以您不应该在最近的Valgrind和Linux + libc中收到这类消息。
-s
-v
--trace-malloc=yes
--default-suppressions=no
--leak-check=full --show-reachable=yes
2条答案
按热度按时间bwleehnv1#
你的程序调用printf。这个库可能会为自己的使用分配内存。更一般地说,根据OS/libc/...,可能会为启动一个程序分配不同的内存。
还请注意,在本例中,您会看到在退出时仍有一个块被分配,并且该块是抑制计数的一部分。这意味着valgrind抑制文件已经确保该内存不会出现在要检查的泄漏列表中。
总之:没问题。
在任何情况下,当您怀疑存在泄漏时,您都可以查看泄漏的详细信息(例如,它们的分配堆栈跟踪),以查看这些泄漏是否由您的应用程序触发。
8aqjt8rx2#
除了@phd的回答,你还可以做几件事来更清楚地看到发生了什么。
如果您使用
-s
或-v
运行Valgrind,它将显示所用抑制的详细信息。你可以使用
--trace-malloc=yes
来查看所有对分配函数的调用(只对小型应用程序这样做)。类似地,你可以使用--default-suppressions=no
来运行,然后你会看到内存的细节(在本例中使用--leak-check=full --show-reachable=yes
)最后,您使用的是旧的Centos / GNU libc吗?几年前,Valgrind提供了一种机制来清理io缓冲区之类的东西,所以您不应该在最近的Valgrind和Linux + libc中收到这类消息。