空悬指针&&野指针

空悬指针(dangling pointer)

指向已经销毁的对象或已经回收的地址,以下情况可能出现空悬指针:

#include <iostream>

int main(){
    char *d = NULL;
    {
        char c = 'c';
        d = &c;
    }
    //变量c释放,d变为空悬指针
}
#include <iostream>
#include <cstring>
int main(){
    char *d = (char *)malloc(sizeof(char));//申请
    free(d);    //d指针空间被释放,d为空悬指针
    d = NULL;   //d不再是空悬指针
}
//当free或者delete调用时,除了释放动态申请的内存,还要将相关的指针指向NULL,避免出现空悬指针。
#include <iostream>
#include <cstring>
int *fun(){
    int num = 123;
    return &num;
}
int main(){
    int *p = fun();
    std::cout<< *p;
}
//num是基于栈的变量,当func函数返回时,变量的空间将被回收,此时获得的指针指向的空间右可能被覆盖。

野指针:

没有初始化的指针,称为野指针,通常编译器会报错。

#include <iostream>
#include <cstring>

int main(){
    char *dp;//野指针,没有初始化
    static char *sdp;//非野指针,因为静态变量会默认初始化为0
}
  • 指针变量没有被初始化(如果值不定,可以初始化为NULL)

  • 指针被free或者delete后,没有置为NULL, free和delete只是把指针所指向的内存给释放掉,并没有把指针本身干掉,此时指针指向的是“垃圾”内存。释放后的指针应该被置为NULL.

  • 指针操作超越了变量的作用范围,比如返回指向栈内存的指针就是野指针。

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值