Valgrind和记忆泄漏

时间:2012-03-31 13:40:04

标签: c++ memory-leaks valgrind

我正在对我的软件进行一些内存分析,并在使用valgrind的以下命令运行标准内存泄漏检查后

valgrind --tool=memcheck --leak-check=full ./path_to_program

我得到以下摘要:

  

== 12550 ==泄漏摘要:

     

== 12550 ==绝对丢失:7块中的597,170字节

     

== 12550 ==间接丢失:10个块中的120个字节

     

== 12550 ==可能丢失:1,455块中的770,281字节

     

== 12550 ==仍然可以访问:2,319个块中的181,189个字节

     

== 12550 ==抑制:0个块中的0个字节

     

== 12550 ==未显示可达块(找到指针的块)。

     

== 12550 ==要查看它们,请重新运行: - leak-check = full --show-reachable = yes

     

== 12550 ==

     

== 12550 ==对于检测到的和抑制的错误计数,请重新运行:-v

     

== 12550 ==错误摘要:来自325个上下文的325个错误(被抑制:176个来自11个)

对我来说看起来不太好,所以我的问题是

  

如果所有这些泄漏,为什么我的程序不会爆炸?

还有什么区别:

  • 绝对丢失
  • 间接丢失
  • 可能丢失
  • 仍然可以访问

我该如何解决这些问题?

1 个答案:

答案 0 :(得分:14)

我建议访问Valgrind FAQ

  

使用Memcheck的内存泄漏检测器,它们之间有什么区别   “绝对输了”,“间接输了”,“可能输了”,“仍然   可达“和”被压制“?

     

详细信息位于Memcheck部分   用户手册。

     

简而言之:

     
      
  • “肯定丢失”意味着你的程序正在泄漏内存 - 修复它们   泄漏!

  •   
  • “间接丢失”意味着你的程序正在泄漏内存   基于指针的结构。 (例如,如果二叉树的根节点是   “绝对输了”,所有的孩子都会“间接迷失”。)如果你   修复“绝对丢失”的泄漏,“间接丢失”泄漏应该去   程。

  •   
  • “可能丢失”意味着你的程序正在泄漏内存,除非你是   使用可能导致它们指向的指针做不寻常的事情   分配块的中间;有些人看到了用户手册   可能的原因。如果您不想看,请使用--show-possibly-lost=no   这些报道。

  •   
  • “仍然可以访问”意味着你的程序可能没问题 - 它没有免费   它可能有一些记忆。这很常见,而且往往是合理的。   如果您不想看到这些报告,请不要使用--show-reachable=yes

  •   
  • “抑制”表示泄漏错误已被抑制。有   默认抑制文件中的一些抑制。你可以忽略   抑制错误。

  •