我的应用程序在一个场景中导致10米的内存泄漏。但是当我用valgrind调试时,以下是泄漏摘要。
812 ==18074== LEAK SUMMARY:
813 ==18074== definitely lost: 0 bytes in 0 blocks.
814 ==18074== possibly lost: 3,424 bytes in 20 blocks.
815 ==18074== still reachable: 10,422 bytes in 47 blocks.
816 ==18074== suppressed: 0 bytes in 0 blocks.
我可以从这个摘要中得到什么?我可以说应用程序没有问题吗?
有人可以解释以下内容吗?什么可能是创建线程的问题?我甚至没有传递动态分配为线程参数的东西。
795 ==18074== 2,448 bytes in 17 blocks are possibly lost in loss record 32 of 33
796 ==18074== at 0x40056BF: calloc (vg_replace_malloc.c:279)
797 ==18074== by 0xC0D71A: _dl_allocate_tls (in /lib/ld-2.3.4.so)
798 ==18074== by 0xD8A91E: pthread_create@@GLIBC_2.1 (in /lib/tls/libpthread-2.3.4.so)
799 ==18074== by 0x8056A28: Server::intithreads() (ServerProcess.cpp:899)
800 ==18074== by 0x8054E39: main (ServerProcess.h:85)
答案 0 :(得分:1)
我不会担心“仍然可以到达”的块。由于在程序退出时释放所有块,因此不必专门释放每个块。为了更好地处理这种情况,您可以尝试在程序的中间阶段释放块,在此之后您不需要它们。另一方面,“可能丢失”的区块性质略显严重。
无论如何,来自Valgrind manual:
“仍然可以访问”。这涵盖了案例 对于下面显示的BBB块。一个 起始指针或链 找到块的起始指针。 由于块仍然指向, 程序员可以,至少在 原则,之前已经解放了 程序退出。因为这些都很好 共同的,可以说不是问题, Memcheck不会报告此类块 除非 指定了--show-reachable = yes。
Pointer chain
-------------
RRR ------------> BBB
RRR ---> AAA ---> BBB
“可能会丢失”。这涵盖了案例 BBB块如下所示。这意味着 一个或多个指针的链 已找到该块,但在 至少有一个指针是 内部指针。这可能只是一个 发生在内存中的随机值 指向一个区块,所以你 除非你,否则不应该考虑这个 知道你有内部指针。
Pointer chain
-------------
RRR ------?-----> BBB
RRR ---> AAA -?-> BBB
RRR -?-> AAA ---> BBB
RRR -?-> AAA -?-> BBB
答案 1 :(得分:0)
根据内存泄漏报告,您的应用程序可能存在问题。 如果“肯定丢失”,“可能丢失”或“仍然可以访问”中的任何一个大于0,那么您就会发生内存泄漏。
“绝对丢失”意味着存在不一致的内存,并且在程序终止时不存在指向它的变量,因为例如变量超出了范围。这意味着泄漏将很难修复,因为您需要找到丢弃它们的位置。
“可能丢失”表示存在不一致的内存,并且 在程序终止时有指向它的变量,但它们可能无法释放内存,因为它们是内部指针,而不是指向块开头的指针,您需要将其传递给free
。
“仍然可达”表示存在不一致的内存,但程序终止时变量直接指向它。这意味着虽然存在泄漏,但它不会增长,因此不会那么严重。