Valgrind没有检测到任何内存泄漏.这有多安全?

Yot*_*tam 5 c++ valgrind memory-leaks

valgrind用这些结果运行了我的代码:

== 4492 == Memcheck,内存错误检测器
== 4492 ==版权所有(C)2002-2009,以及GNU GPL'd,作者:Julian Seward等.
== 4492 ==使用Valgrind-3.5.0和LibVEX; 用-h重新运行版权信息
== 4492 ==命令:./ mem
== 4492 ==父PID:4455
== 4492 ==
== 4492 ==
== 4492 == HEAP SUMMARY:
== 4492 == in在退出处使用:0个块中的0个字节
== 4492 ==总堆使用量:19,595,342个分配,19,595,342个释放,27,194,270个字节分配== 4492 ==
== 4492 ==所有堆块都被释放 - 没有泄漏可能
== 4492 ==
== 4492 ==对于检测到的和抑制的错误计数,请重新运行:-v
== 4492 ==错误摘要:0个上下文中的0个错误(抑制:4个中的4个)

但是,在代码运行时,我看到程序使用的内存小幅稳定增加.我对这个结果有多确定?

我跑步valgrind使用:

valgrind --track-origins=yes --leak-check=yes
    --tool=memcheck --read-var-info=yes --log-file=error.txt`
Run Code Online (Sandbox Code Playgroud)

然后我使用-g-march=core2标签编译程序.

Pla*_*aHH 8

您需要区分内存泄漏(已分配的内存,但丢失了所有引用)和内存占用(已分配的内存,您保留引用但忘记取消分配).

valgrind无法检测到后者,因为valgrind不知道你不想再使用它了.

要获得有关程序内存使用情况的一些统计信息,可以使用valgrind的massif工具,它将更详细地向您显示内存分配的位置.这可能有助于寻找记忆力.

  • @Hasturkun:是的,但它不会检测到你在程序运行期间忘记解除分配的内存,但最终会解除分配.就像你总是新的,然后不是删除一样,将东西推入你认为你正在分配的池中. (2认同)