valgrind需要帮助

时间:2010-11-11 12:33:43

标签: valgrind

我的应用程序在一个场景中导致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)  

2 个答案:

答案 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

“仍然可达”表示存在不一致的内存,但程序终止时变量直接指向它。这意味着虽然存在泄漏,但它不会增长,因此不会那么严重。