Valgrind声称存在不确定的记忆。这不好吗?

时间:2010-01-27 04:15:15

标签: c memory-leaks valgrind memcheck

Valgrind在我的代码中给出了以下泄漏摘要。但是,我释放了所有的malloc'ed内存。这是件坏事还是这是正常的?我的节目在c。

  

== 3513 ==泄漏摘要:

     

== 3513 ==绝对丢失:0个块中的0个字节。

     

== 3513 ==可能丢失:0个块中的0个字节。

     

== 3513 ==仍然可以访问:1个块中有568个字节。

     

== 3513 ==抑制:0个块中的0个字节。

7 个答案:

答案 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直接运行... :)