内存泄漏:绝对丢失,甚至可能丢失

时间:2018-10-11 11:38:37

标签: memory-leaks valgrind

当我通过在代码中添加泄漏来运行valgrind时,对于第一个块分配,我仍然发现泄漏仍然可以实现,然后显示为9个块的绝对丢失。可能由于代码的其他部分而丢失。为什么会这样?

main()
{
........

char *ptr;
For(i=0;i<10;i++)
{
ptr=malloc(sizeof * ptr);
}

.....

}

报告:

HEAP SUMMARY:
==13832==     in use at exit: 202,328 bytes in 62 blocks
==13832==   total heap usage: 332 allocs, 270 frees, 283,928 bytes allocated
==13832==
==13832== LEAK SUMMARY:
==13832==    definitely lost: 90 bytes in 9 blocks
==13832==    indirectly lost: 0 bytes in 0 blocks
==13832==      possibly lost: 202,180 bytes in 49 blocks
==13832==    still reachable: 58 bytes in 4 blocks
==13832==         suppressed: 0 bytes in 0 blocks
==13832== Rerun with --leak-check=full to see details of leaked memory

2 个答案:

答案 0 :(得分:1)

memcheck manual这样说:

  
      
  • “可能丢失”。 […]这意味着已找到一个或多个指向该块的指针链,但是至少一个指针是内部指针。这可能只是内存中的一个随机值,恰好指向一个块,因此除非您知道您有内部指针,否则您不应该认为这很好。
  •   

因此,通常只有当您在堆上具有嵌套的数据结构(指针指向一个分配,偏移而不是直接指向开头)时,才会发生这种情况。

答案 1 :(得分:1)

在Florian的回答中,以下是一些内部指针的示例

  1. 内存管理器。例如,您知道将要分配许多相同大小的小内存块,因此您编写了一个内存管理器来分配大块并将它们细分为较小的大小。这些子块分配是内部指针。
  2. 一个内存调试器。在这种情况下,您分配的内存将超过请求的数量,并且多余的内存将用于填充分配的内存。返回给客户端的指针是内部指针。
  3. 数据结构,例如Pascal字符串。在这里,您可以为字符串及其大小分配内存。大小位于字符串之前,因此指向字符串开头的指针是内部指针。