C/C++ 野指针 僵尸对象

今天在实现平衡二叉树的一系列操作的时候,发现了一个以前不经常注意的地方,记录一下;

 

每个程序在执行时都会占用一块可用的内存空间(malloc、new),用于存放动态分配的对象,此内存空间称为自由存储区或堆。

在使用完这块内存之后,就需要我们自己释放这块内存,否则程序就会存在内存泄漏的问题。

这里要注意野指针、僵尸对象的概念:

      野指针:指针所指向的内存已经被释放掉,而指针没有被置为NULL,则会变成野指针

      1、free、delet 释放仅仅是指针指向的内存(堆空间),让这块内存可以被系统重新分配,而不是销毁指针对象,指针对象是个变量,存在自己的生命周期,随程序的结束而被销毁;

      2、另外,free、delet并不会将指针对象置为NULL,所以在释放空间之后,一定要手动置为NULL,防止后面程序以为他是合法指针,再次进行解引用操作,造成错误;

  

僵尸对象:指已经被释放的空间对象

1、malloc像系统在堆空间申请一块闲置的空间,作为程序需要数据的存放,此时这块空间受保护,不会被其它程序申请

2、free告诉系统不再需要这块空间,可以释放掉,允许系统将它分配给其它程序使用

3、free之后,这块空间(指针指向地址)的数据还是存在的,当分配给其它对象的时候,才会被修改;

 

使用野指针访问僵尸对象:

1、free指针之后,仅仅是告诉系统回收这块空间,但是空间内的数据以及指针的值(地址)都不会发生改变;

2、因为指针的值和空间数据都还在,所以是可以通过解引用野指针来访问僵尸对象的,但是最好不要这么做,因为如果这块空间被重新分配了重要数据,可能会造成严重的问题,free之后必须手动将指针置为NULL;

  3、从下面可以看到,指针已经被free掉了,但是还是可以通过这个指针访问到原来的空间,所以每次释放指针以后,一定要置为NULL,这样在解引用的时候就不会 误操作到野指针

if( p != NULL )

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值