内存泄漏和野指针

内存泄漏:是指在堆区,alloc 或new 创建了一个对象,但是并没有放到自动释放池中,或者没有free 对象,导致这块内存一直被占用,换一种方法说,就是没有指针指向这块内存,再通俗点,开辟了一段空间,在没有被释放之前,结果找不到这块内存了,这样就会造成内存泄漏的问题。这块内存会直至程序运行结束才会被释放。

野指针:是指针指向已经delete 的对象,或者是未申请访问的受限制的区域的时候,会造成野指针指向,直接使程序奔溃。
在这里插入图片描述

如何形象的解释内存泄漏和野指针

内存泄漏:首先要说到如何为一块变量申请一块内存空间。

当你要为变量a申请一块内存空间的时候,需要用到malloc函数。如何申请这块内存空间呢?这就变成程序的工作了。程序首先会向系统申请一块内存空间,然后程序会把申请好的这块内存空间的首地址赋给变量a,假设这时候变量a拿到的首地址为0x1234,如果我们现在要对变量a进行循环操作,那么每循环一次,变量a就会拿到一个新的首地址,这样的话,内存空间就会被不断的分配给变量a。

但是现在要注意的是每拿到一次新的首地址,旧的首地址就会被覆盖,但是旧的内存空间的使用权依然在程序手里。这里要分清楚两个概念,系统和程序。通常情况下,是由程序向系统申请空间,空间的分配权在系统手里。虽然旧的地址呗覆盖,但是使用权依旧掌握在程序手中,所以,程序能使用的空间越来越少,最终导致内存不够而泄露。

野指针:当程序向系统申请一块内存空间时候,程序会把申请号好的这块内存空间的首地址赋给变量a,假设变量a拿到的首地址是0x3456,那么当这块空间使用完成被free释放了之后,这块空间的使用权又被程序还给了系统,但是这个时候如果没有给变量a赋NULL值,那么变量a手里拿到的依旧还是这个首地址0x3456,这个地址是没有被销毁的,所以既然它有一个首地址,那么就可以指向一个地址,但是,由于这个地址所在的内存空间的使用权已经不属于程序,因此,这个时候变量a的指向操作就是不合法的,这样的指针就被称为野指针。

在这里我用一个比喻来说明什么是内存泄漏,什么是指针。
张三指的是变量a;房产证指的是内存空间的使用权;钥匙指的是内存空间的首地址。
在这里插入图片描述

当张三拿到房子1的房产证和钥匙,这个时候他就可以使用这个房子1,过了一段时间,张三又买了一套房子,我们简称房子2,但是这个时候张三把房子1的钥匙给丢了,由于房产证依然是张三的,所以别人不能住这个房子,但是由于张三没有了钥匙,所以他也不能进到房子1里,房子1就这样被空置下来。
以此类推,当张三买了很多套房子,但是由于他弄丢了钥匙住不了,而别人是因为没有房产证,所以也住不了,所以这些房子都空置下来了。当空置的房子过多时,就变成了内存泄漏。

当张三拿到房子的钥匙和房产证,当房产证被free了(内存被释放),也就等于说房产证丢了。
这个时候如果变量a没有赋NULL值,也就等于说钥匙还在张三手里(首地址还在变量a中),所以虽然钥匙还在张三手中,但是没有房产证,他再进这个房子就变成非法进入了,这就是野指针。
如何形象的解释内存泄漏和野指针

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值