我正在对我的软件进行一些内存分析,并在使用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个)
对我来说看起来不太好,所以我的问题是
如果所有这些泄漏,为什么我的程序不会爆炸?
还有什么区别:
我该如何解决这些问题?
答案 0 :(得分:14)
我建议访问Valgrind FAQ:
使用Memcheck的内存泄漏检测器,它们之间有什么区别 “绝对输了”,“间接输了”,“可能输了”,“仍然 可达“和”被压制“?
详细信息位于Memcheck部分 用户手册。
简而言之:
“肯定丢失”意味着你的程序正在泄漏内存 - 修复它们 泄漏!
“间接丢失”意味着你的程序正在泄漏内存 基于指针的结构。 (例如,如果二叉树的根节点是 “绝对输了”,所有的孩子都会“间接迷失”。)如果你 修复“绝对丢失”的泄漏,“间接丢失”泄漏应该去 程。
“可能丢失”意味着你的程序正在泄漏内存,除非你是 使用可能导致它们指向的指针做不寻常的事情 分配块的中间;有些人看到了用户手册 可能的原因。如果您不想看,请使用
--show-possibly-lost=no
这些报道。“仍然可以访问”意味着你的程序可能没问题 - 它没有免费 它可能有一些记忆。这很常见,而且往往是合理的。 如果您不想看到这些报告,请不要使用
--show-reachable=yes
。“抑制”表示泄漏错误已被抑制。有 默认抑制文件中的一些抑制。你可以忽略 抑制错误。