valgrind内存检测中五种内存丢失的解释
结果示例:
LEAK SUMMARY:
definitely lost
: 140 bytes in 5 blocks.
indirectly lost
: 1,252 bytes in 41 blocks.
possibly lost
: 0 bytes in 0 blocks.
still reachable
: 36 bytes in 1 blocks.
suppressed
: 0 bytes in 0 blocks.
1) still reachable
: 表示泄漏的内存在程序运行完的时候,仍旧有指针指向它,因而,这种内存在程序运行结束之前可以释放。一般情况下valgrind不会报这种泄漏,除非使用了参数 --show-reachable=yes。
注意:
一般说来,为static指针变量或全局的指针变量(它们的生存期是全局的)进行内存分配,如果没有释放它,虽然这也是"not-freed blocks",但是它是"reachable"的.现代的OS会得到这些指针并去释放它.
2) definitely losg
: 明确地已经泄漏了,因为在程序运行完的时候,没有指针指向它, 指向它的指针在程序中丢失了。一般这种泄漏常见,而且比较难发现问题所在。
3) indirectly lost
: 间接地 ????????????????
4) possibly lost
: 发现了一个指向某块内存中部的指针,而不是指向内存块头部。这种指针一般是原先指向内存块头部,后来移动到了内存块的中部,还有可能该指针和该内存根本就没有关系,检测工具只是怀疑有内存泄漏。
5) suppressed:
使用参数设置:
valgrind --leak-check=full --show-reachable=no –show-leak-kinds=all –track-origins=yes --log-file=文件名 ./a.out
--leak-check=full 指的是完全检查内存泄漏
--show-reachable=yes 是显示内存泄漏的地点
--trace-children=yes 是跟入子进程。
–log-file
指定报告输出文件
–track-origins=yes
是否显示未定义的变量,在堆、栈中被定义没有被initialised的变量都被定义成origins。默认是关闭这个option的。
–show-leak-kinds=all
这里可以支持的选项有[definite|possible],一般只需要去关注definite(绝逼),possible是可能会存在。
–leak-check=full
当服务器退出时是否收集输出内存泄漏,选项有[no|summary|full]这个地方我们将其设置成全输出,默认将会使用summary方式。