【问题标题】:Memory leakage :Definitely lost and possibly lost内存泄漏:肯定丢失,也可能丢失
【发布时间】:2018-10-11 11:38:37
【问题描述】:

当我通过向我的代码添加泄漏来运行 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

【问题讨论】:

    标签: memory-leaks valgrind


    【解决方案1】:

    除了弗洛里安的回答,这里有几个例子说明你可以在哪里使用内部指针

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

    【讨论】:

      【解决方案2】:

      memcheck manual 是这样说的:

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

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

      【讨论】:

      • 那我该如何解决可能丢失的案件?你能举个例子让我更清楚吗?
      猜你喜欢
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2021-03-17
      相关资源
      最近更新 更多