Valgrind在我的代码中给出了以下泄漏摘要。但是,我释放了所有的malloc'ed内存。这是件坏事还是这是正常的?我的节目在c。
== 3513 ==泄漏摘要:
== 3513 ==绝对丢失:0个块中的0个字节。
== 3513 ==可能丢失:0个块中的0个字节。
== 3513 ==仍然可以访问:1个块中有568个字节。
== 3513 ==抑制:0个块中的0个字节。
答案 0 :(得分:7)
valgrind消息still reachable: 568 bytes in 1 blocks.
表示应用程序中释放的内存仍然是“可访问的”,这意味着您仍然可以在某处找到指向它的指针。在关闭时,这可能意味着某种全局变量。但是,由于“绝对泄漏”或“可能泄漏”的字节数为零,因此这种情况完全是良性的。别担心。
答案 1 :(得分:6)
仍然可达的内存意味着它被全局或静态指针指向。您想要做的是使用--show-reachable=yes
运行valgrind以查看它是否有问题。
通常它是无害的,来自这样的功能:
void foo()
{
static char *buffer = 0;
if (buffer == 0)
{
buffer = (char *)malloc(...);
}
}
仍然可以访问malloc。但是无论调用foo多少次,你都只需要分配一次缓冲区,这样就不会有任何伤害。
但考虑一下这样的函数:
void foo()
{
static node_t *head = 0;
node_t *node = (node_t *)malloc(sizeof(node_t));
if (node)
{
node->next = head;
head = node;
}
...
}
每次调用此函数时,都会分配另一个节点。虽然您可能只为测试运行泄漏了几个节点,但在生产运行中,您可能会泄漏到足以导致内存不足。
区分的一种方法是查看不同的运行是否总是泄漏相同的内存,或者在使用更大输入的测试运行时泄漏更多内存。
但是,如果您想要安全,请使用--show-reachable=yes
并查看正在发生的事情。
答案 2 :(得分:2)
这些都没有泄露,没有什么值得关注的。内存可能是由C库分配的。如果您真的想知道它们的分配位置,请使用--leak-check=full --show-reachable=yes
。
答案 3 :(得分:1)
如果你确定你“释放了所有的摩托车记忆”,那么,没有什么不对的。您并不直接对其他方的组件中的内存泄漏负责,即使您可能经常需要解决它们。
来自valgrind的报告并没有给我们足够的信息来帮助你。
我见过内存检查工具多次出现误报,但我对valgrind本身没有任何直接经验。
答案 4 :(得分:1)
它能给你块的地址吗?有时你可以通过查看那些568字节中的数据类型来学到很多东西。
嗯,568字节,大约是MAX_PATH unicode字符串的大小。
答案 5 :(得分:1)
将free()'ed指针清零是个好主意,这会导致(错误地)尝试再次取消引用它们时发生崩溃。
答案 6 :(得分:0)
就个人而言,我总是忘记和检查像valgrind make test
那样总是添加至少几个额外的可访问字节...确保你的应用程序正在由valgrind直接运行... :)