我正在对我的软件进行一些内存分析,并在使用 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 个错误(已抑制:来自 11 个上下文的 176 个错误)
对我来说看起来不太好,所以我的问题是
如果我的程序存在所有这些泄漏,为什么它不会爆炸?
还有什么区别:
我该如何修复它们?
我建议参观Valgrind 常见问题解答 http://valgrind.org/docs/manual/faq.html#faq.deflost:
使用Memcheck的内存泄漏检测器,有什么区别
“肯定丢失”、“间接丢失”、“可能丢失”、“仍然丢失”
可达”和“抑制”?
详细信息在 Memcheck 部分
用户手册的。
简而言之:
“肯定丢失”意味着你的程序正在泄漏内存 - 修复这些
泄漏!
“间接丢失”意味着你的程序正在泄漏内存
基于指针的结构。 (例如,如果二叉树的根节点是
“肯定丢失”,所有孩子都将“间接丢失”。)如果你
修复“绝对丢失”的泄漏,“间接丢失”的泄漏应该消失
离开。
“可能丢失”意味着你的程序正在泄漏内存,除非你
使用指针做不寻常的事情,可能导致它们指向
已分配块的中间;一些请参阅用户手册
可能的原因。使用--show-possibly-lost=no
如果你不想看
这些报告。
“仍然可达”意味着你的程序可能没问题——它不是免费的
它可能有一些记忆。这是很常见的,而且往往是合理的。
不要使用--show-reachable=yes
如果您不想看到这些报告。
“抑制”意味着泄漏错误已被抑制。有
默认抑制文件中的一些抑制。你可以忽略
抑制错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)