Valgrind和记忆泄漏

Mat*_*teo 4 c++ valgrind memory-leaks

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

valgrind --tool=memcheck --leak-check=full ./path_to_program
Run Code Online (Sandbox Code Playgroud)

我得到以下摘要:

== 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个)

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

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

还有什么区别:

  • 肯定输了
  • 间接失去了
  • 可能会丢失
  • 仍然可以到达

我该如何解决这些问题呢?

Oli*_*rth 14

我建议参观Valgrind FAQ:

使用Memcheck的内存泄漏检测器,"绝对丢失","间接丢失","可能丢失","仍然可达"和"抑制"之间的区别是什么?

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

简而言之:

  • "绝对丢失"意味着你的程序正在泄漏内存 - 修复这些漏洞!

  • "间接丢失"意味着您的程序在基于指针的结构中泄漏内存.(例如,如果二叉树的根节点"绝对丢失",则所有子节点将"间接丢失".)如果您修复了"绝对丢失"的泄漏,"间接丢失"的泄漏应该消失.

  • "可能丢失"意味着你的程序正在泄漏内存,除非你用指针做一些不寻常的事情,这些指针可能导致它们指向分配块的中间; 有关可能原因,请参阅用户手册.使用--show-possibly-lost=no,如果你不希望看到这些报道.

  • "仍然可以访问"意味着你的程序可能没问题 - 它没有释放它可能拥有的一些内存.这很常见,而且往往是合理的.--show-reachable=yes如果您不想看到这些报告,请不要使用.

  • "抑制"表示泄漏错误已被抑制.默认抑制文件中存在一些抑制.您可以忽略已抑制的错误.