C/C++野指针

2020-12-08 15:16:06 浏览数 (1)

野指针:野指针不同于空指针,空指针是指一个指针的值为null,而野指针的值并不为null,野指针会指向一段实际的内存,只是它指向哪里我们并不知情,或者是它所指向的内存空间已经被释放,所以在实际使用的过程中,我们并不能通过指针判空去识别一个指针是否为野指针。避免野指针只能靠我们自己养成良好的编程习惯,下面说说哪些情况下会产生野指针,以及怎样避免。

1. 指针变量的值未被初始化:声明一个指针的时候,没有显示的对其进行初始化,那么该指针所指向的地址空间是乱指一气的。如果指针声明在全局数据区,那么未初始化的指针缺省为空,如果指针声明在栈区,那么该指针会随意指向一个地址空间。所以良好的编程习惯就是在声明指针的时候就对其进行初始化,如果暂时不知道该初始化成什么值,就先把指针置空。

代码语言:javascript复制
void func()
{
    int *ptr;    // 野指针
    if (ptr != nullptr) {
        ……do_somthing
    }
}

2.指针所指向的地址空间已经被free或delete:在堆上malloc或者new出来的地址空间,如果已经free或delete,那么此时堆上的内存已经被释放,但是指向该内存的指针如果没有人为的修改过,那么指针还会继续指向这段堆上已经被释放的内存,这时还通过该指针去访问堆上的内存,就会造成不可预知的结果,给程序带来隐患,所以良好的编程习惯是:内存被free或delete后,指向该内存的指针马上置空。

代码语言:javascript复制
void func()
{
    int *ptr = new int[5];
    delete []ptr;
// 执行完delete后,ptr野指针
}

3.指针操作超越了作用域:

代码语言:javascript复制
void func()
{
    int *ptr = nullptr;
    {
        int a = 10;
        ptr = &a;
    } // a的作用域到此结束
    int b = *ptr;    // ptr指向a,a已经被回收,ptr野指针

转载于:https://www.cnblogs.com/418ks/p/10743902.html

0 人点赞