Valgrind 内存问题简述

本文介绍了Valgrind工具在检测内存问题中的应用,包括内存泄露、内存错误及其类型,并阐述了Valgrind的工作原理,如valid-value和valid-address位。通过多个案例展示了不同类型的内存泄露和错误,帮助理解Valgrind的检测效果。
摘要由CSDN通过智能技术生成

参数配置

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

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值