参数配置
gcc
-g:
增加调试信息,供valgrind精确定位。-O0:
关闭gcc优化;优化产生的代码可能会造成valgrind误判。
valgrind
-
--leak-check=full
no: 不进行内存泄露检测; summary: 显示内存泄露情况; full:不仅显示内存泄露,还显示出错代码。
-
--show-reachable=yes
详细显示still reachable 和 indirectly lost两种类型的内存泄露,默认不显示;如case1和case4。
内存泄露
内存泄露: 由于疏忽或错误造成程序未能释放已经不能再使用的内存。 —— 维基百科
指针
start-pointer:
指向内存起始位置
interior-pointer:
指向内存中间位置
泄露类型
possibly lost:
指针指向内存的内部位置。
still reachable:
程序运行结束后,虽然没有被释放,但仍然可以访问。
definitely lost:
内存无法被访问。
indirectly lost:
虽然有地址指向该空间,但已经无法被访问了。
泄露举例
Pointer chain AAA Leak Case BBB Leak Case
------------- ------------- -------------
(1) RRR ------------> BBB DR
(2) RRR ---> AAA ---> BBB DR IR
(3) RRR BBB DL
(4) RRR AAA ---> BBB DL IL
(5) RRR ------?-----> BBB (y)DR, (n)DL
(6) RRR ---> AAA -?-> BBB DR (y)IR, (n)DL
(7) RRR -?-> AAA ---> BBB (y)DR, (n)DL (y)IR, (n)IL
(8) RRR -?-> AAA -?-> BBB (y)DR, (n)DL (y,y)IR, (n,y)IL, (_,n)DL
(9) RRR AAA -?-> BBB DL (y)IL, (n)DL
Pointer chain legend:
- RRR: a root set node or DR block
- AAA, BBB: heap blocks
- --->: a start-pointer
- -?->: an interior-pointer
Leak Case legend:
- DR: Directly reachable
- IR: Indirectly reachable
- DL: Directly lost
- IL: Indirectly lost
- (y)XY: it's XY if the interior-pointer is a real pointer
- (n)XY: it's XY if the interior-pointer is not a real pointer
- (_)XY: it's XY in either case
case1: RRR ---> BBB
void *RRR;
int main()
{
RRR = malloc(8);
return 0;
}
==1244== LEAK SUMMARY:
==1244==still reachable
: 8 bytes in 1 blocks
case2: RRR ---> AAA ---> BBB