Memory leaks 内存泄漏:肯定丢失或可能丢失

Memory leaks 内存泄漏:肯定丢失或可能丢失,memory-leaks,valgrind,Memory Leaks,Valgrind,当我通过向代码中添加泄漏来运行valgrind时,我得到的泄漏对于第一次分配的块仍然是可到达的,然后对于9个块显示为肯定丢失。可能丢失是由于代码的其他部分而显示的。为什么会这样 main() { ........ char *ptr; For(i=0;i<10;i++) { ptr=malloc(sizeof * ptr); } ..... } 报告说: “可能迷路了”。[…]这意味着找到了指向块的一个或多个指针链,但至少有一个指针是内部指针。这可能只是内存中的一个随机值,它恰好

当我通过向代码中添加泄漏来运行valgrind时,我得到的泄漏对于第一次分配的块仍然是可到达的,然后对于9个块显示为肯定丢失。可能丢失是由于代码的其他部分而显示的。为什么会这样

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

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

.....

}
报告说:

  • “可能迷路了”。[…]这意味着找到了指向块的一个或多个指针链,但至少有一个指针是内部指针。这可能只是内存中的一个随机值,它恰好指向一个块,因此,除非知道内部指针,否则不应该考虑这一点。

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

除了Florian的答案之外,下面是一些内部指针的示例

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

  • 那么我怎样才能解决可能丢失的案件呢?你能举个例子让我更清楚一些吗。
    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