野指针

作者: 小李不木 | 来源:发表于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 - 博客园

相关文章

  • 什么是野指针?什么是僵尸对象?

    野指针与僵尸对象 1. 野指针 1>C语言中的野指针:一个指针变量指向一块随机的空间,这个指针就是野指针当我们声明...

  • 空指针和野指针

    1、什么是空指针,什么是野指针 2、野指针的危害

  • iOS监控-野指针定位

    iOS监控-野指针定位 iOS监控-野指针定位

  • 野指针空指针万能指针

    野指针空指针万能指针

  • 野指针危害真的很大吗?

    想要知道野指针危害到底有多大,首先需要知道野指针是怎么形成的,以及形成野指针会带来什么本质上的缺点。 当然,野指针...

  • iOS-空指针,野指针,僵尸对象

    浅谈一下空指针,野指针,僵尸对象。 空指针:没有存储任何内存地址的指针,空指针的值是0; 野指针:指针指向的对象已...

  • 野指针

    概念:野指针指指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为NU...

  • 野指针

    野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为NULL避免...

  • 野指针

    野指针是让人非常淡疼的一件事,遇到这种问题,人品好的时候程序正常运行,人品差的时候隔三差五的Crash,还不好找,...

  • 野指针

    指针是个很强大的工具,可是正因为它太强大,所以要操作它不是件易事。操作不当造成的野指针,甚至会引起系统死机等比较严...

网友评论

      本文标题:野指针

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