2012-03-31 100 views
4

我做的内存分析,以我的软件的一点点,用的valgrind的以下命令运行标准内存泄漏检查后Valgrind的和内存泄漏

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

我得到了以下总结:

= = 12550 == LEAK内容:

== 12550 ==绝对丢失:597170个字节在7个块

== 12550 == indirectl ÿ丢失:120个字节在10个块

== 12550 ==可能丢失:770281个字节在1455块

== 12550 ==仍可达:在2319块

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

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

== == 12550要看到他们后,再重新用:--leak检查=全--show-可达= YES

== == 12550

== == 12550计数为-v

== == 12550错误摘要:从325个上下文325个错误(抑制:176 11)

它看起来并不很不错,我检测到并取消错误,请重新运行与,所以我的问题是

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

而且还之间有什么区别:

  • 肯定失去
  • 间接失去
  • 可能失去
  • 仍可达

,我怎么可以尝试修复他们?

+4

为什么你会期望它爆炸? – 2012-03-31 13:41:02

+0

@OliCharlesworth因为它有很多分配的内存没有释放 – Matteo 2012-03-31 13:41:41

+0

@Matteo:在最差的情况下,这几乎是几MB,除非你处于非常有限的环境中,否则没有理由“炸毁”它。 – Mat 2012-03-31 13:42:48

回答

14

我建议您访问Valgrind FAQ

随着MEMCHECK的内存泄漏检测器,什么是“肯定丢失”,“间接丢失”,“可能失去”,“仍然 可达” 之间的差异,以及“压制”?

详细信息请参阅用户手册的Memcheck部分 。

简而言之:

  • “肯定失去了” 是指你的程序正在泄漏内存 - 修复这些 泄漏! “

  • ”间接丢失“表示您的程序在基于指针的结构中泄漏内存。 (例如,如果二叉树的根节点为“绝对丢失”,则所有孩子将“间接丢失”)。如果你修复了“绝对丢失”的泄漏,则“间接丢失”泄漏应该离开 。

  • “可能失去”是指你的程序正在泄漏内存,除非你 做不寻常的事情与可能会导致他们点进 分配的块的中间指针;有关 可能的原因,请参阅用户手册。如果您不希望看到 这些报告,请使用--show-possibly-lost=no。 “

  • ”仍然可以到达“意味着你的程序可能没问题 - 它没有免费使用 它可能有的内存。这是相当普遍而且经常合理的。 如果您不想看到这些报告,请勿使用--show-reachable=yes

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

+0

指出! – Matteo 2012-03-31 13:50:37