代码之家  ›  专栏  ›  技术社区  ›  Ritwik Bose

Valgrind声称有未释放的记忆。这不好吗?

  •  3
  • Ritwik Bose  · 技术社区  · 15 年前

    Valgrind为我的代码提供了以下泄漏摘要。但是,我已经释放了所有的记忆。这是件坏事,还是很正常?我的课程是C。

    ==3513==泄漏汇总:

    ==3513==肯定丢失:0块0字节。

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

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

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

    7 回复  |  直到 11 年前
        1
  •  7
  •   JSBÕ±Õ¸Õ£Õ¹    15 年前

    Valgrind消息 still reachable: 568 bytes in 1 blocks. 意味着应用程序中释放了内存,而内存仍然是“可访问的”,这意味着在某个地方仍然有指向它的指针。在关机时,这可能意味着某种全局变量。但是,由于“肯定泄漏”或“可能泄漏”的字节数为零,所以这种情况是完全良性的。别担心。

        2
  •  6
  •   R Samuel Klatchko    15 年前

    仍然可以访问的内存意味着它正被全局或静态指针指向。你要做的是和Valgrind一起跑 --show-reachable=yes 看看是否有问题。

    通常情况下,它是无害的,来自这样的功能:

    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=是 看看发生了什么。

        3
  •  2
  •   mark4o    15 年前

    这些都没有泄漏,也不需要担心。内存可能是由C库分配的。如果你真的想知道他们被分配到哪里,那就去跑步吧。 --leak-check=full --show-reachable=yes .

        4
  •  1
  •   paxdiablo    15 年前

    如果你确定你“已经释放了所有的记忆”,那么,没有什么错。对于来自其他方的组件中的内存泄漏,您不负直接责任,即使您可能经常需要解决这些问题。

    Valgrind的报告没有给我们足够的信息来帮助你。

    我见过很多次内存检查工具会产生误报,但我对Valgrind本身没有任何直接的经验。

        5
  •  1
  •   John Knoeller    15 年前

    它能告诉你这个街区的地址吗?有时,通过查看568字节中的数据类型,您可以学到很多东西。

    嗯,568字节,大约是max-path-unicode字符串的大小。

        6
  •  1
  •   Arthur Kalliokoski    15 年前

    将空闲的指针归零是个好主意,这将导致(错误地)尝试再次取消引用它们时发生崩溃。

        7
  •  0
  •   Kamiccolo    11 年前

    就我个人而言,我总是像 valgrind make test 它总是添加至少两个附加的仍然可以访问的字节…确保您的应用程序正由Valgrind直接运行…:)