野指针

作者: 小李不木 | 来源:发表于2019-06-10 18:19 被阅读0次

    1: 野指针:未初始化的指针,其指针内容为一个垃圾数。指针在被定义的时候,如果程序不对其进行初始化的话,它会指向随机区域,因为任何指针变量(除了static修饰的指针变量)在被定义的时候是不会被置空的,它的默认值是随机的。随机的值可能是一个没有被分配使用的内存地址,也可能是操作系统的内存地址,之后如果再对这个未初始化的指针进行赋值,可能就会更改操作系统的数据,运行可能发生不可知的崩溃错误。

    2、悬空指针:指针正常初始化,曾指向过一个正常的对象,但是对象销毁了,该指针未置空。我们在用malloc开辟内存空间时,要检查返回值是否为空,如果为空,则开辟失败;如果不为空,则指针指向的是开辟的内存空间的首地址。指针指向的内存空间在用free()或者delete(注意delete只是一个操作符,而free()是一个函数)释放后,如果程序员没有对其置空或者其他的赋值操作,就会使其成为一个野指针。

    3、指针操作超越变量作用域 。同2就是超过作用域的变量已经被释放,但是指针依然存在。不要返回指向栈内存的指针或引用,因为栈在函数结束的时候会被释放,此时指针指向的内存已经无效了,而指针没有被置空,解引用一个非空的无效指针是一个未被定义的行为,也就是说不一定导致段错误,野指针很难定位到是哪里出现的问题,在哪里这个指针就失效了,不好查找出错的原因,调试起来会很麻烦。

    规避方法

    初始化指针时将其置为NULL,之后再对其进行操作。

    释放指针时将其置为NULL或0,最好在编写代码时将free()函数封装一下,在调用free()后就将指针置为NULL

    注意在使用时对指针的合法性的判断

    void Free(void *p) {

        if (p != NULL) {

            free(p);

            p = NULL;

        }

    }

    小结:

    悬空指针是指那些你已经释放掉的内存指针。当你调用free(p)时,p指向的内存被释放了。p本身没有变化仍然存在。它指向的内存仍然是有效的,你可以继续读写p指向的内存,但是释放掉的内存可能会被内存管理器重新分配,此时,p指针指向的内存已经被赋予新的意义,已经不是原来想要的数据。对它的访问是不可预料的。 

    指针使用相关技术:

    野指针及c++指针使用注意点 - 小菜鸡y - 博客园

    野指针的产生及其危害 - 小心眼儿猫的博客 - CSDN博客

    空悬指针和野指针(Dangling pointer and wild pointer) - drunknbeard - 博客园

    相关文章

      网友评论

          本文标题:野指针

          本文链接:https://www.haomeiwen.com/subject/vrazxctx.html