c/c++语言开发共享C++野指针和悬空指针的实现方法

目录野指针和悬空指针是指针中常见的两个概念,本文结合实例讲解来讲解下。一、野指针野指针是指尚未初始化的指针,既不指向合法的内存空间,也没有使用 null/nullptr 初始化指针。来看一个简单例子:

目录

野指针和悬空指针是指针中常见的两个概念,c/c++开发分享C++野指针和悬空指针的实现方法结合实例讲解来讲解下。

一、野指针

野指针是指尚未初始化的指针,既不指向合法的内存空间,也没有使用 null/nullptr 初始化指针。

来看一个简单例子:

  #include <iostream>  using namespace std;     int main()  {      int *p;     // 野指针      int *q = null; // 非野指针      p = new int(5);  // p 现在不再是野指针      q = new int(10);       cout<<"*p = "<<*p<<endl;      cout<<"*q = "<<*q<<endl;      free(p);      free(q);      return 0;  }  

输出结果为:

linuxy@linuxy:~/wildpointer$ ./main
*p = 5
*q = 10
linuxy@linuxy:~/wildpointer$

p 在定义时并没有赋初值,这时候为野指针。

二、悬空指针

悬空指针是指 指针指向的内存空间已被释放或不再有效。

有三种情况会产生悬空指针,下面结合实例来看一下:

2.1 情况一

释放指针资源后,未再次赋值前。

  #include <iostream>  using namespace std;     int main()  {      int *p = new int(5);      cout<<"*p = "<<*p<<endl;      free(p);  // p 在释放后成为悬空指针      p = null; // 非悬空指针      return 0;  }  

p 指针在被 free 后,成为悬空指针,被 null 赋值后不再是悬空指针。

注意:这里 free 掉的是 p 的内存空间,并不是变量 p,结合一个例子看下:

  #include <iostream>  using namespace std;     int main()  {      int *p = new int(5);      cout<<"*p = "<<*p<<endl;      cout<<"p 地址:"<<p<<endl;      free(p);  // p 在释放后成为悬空指针      cout<<"p 地址:"<<p<<endl;      cout<<"*p = "<<*p<<endl;      p = null; // 非悬空指针      return 0;  }  

输出结果为:

linuxy@linuxy:~/wildpointer$ ./main
*p = 5
p 地址:0x55a885ef6eb0
p 地址:0x55a885ef6eb0
*p = 0
linuxy@linuxy:~/wildpointer$

可以看到, free 前后 p 的地址是不变的,free 释放的是 p 指向的内存空间,释放后表示该快内存可以重新分配了,至于 free 后 *p 的值,视不同编译器情况而不同。

2.2 情况二

超出了变量的作用范围。

  #include <iostream>  using namespace std;     int main()  {      int *p;      {          int tmp = 10;          p = &tmp;      }      //p 在此处成为悬空指针      return 0;  }   

在上述例了中,变量 tmp 的作用范围为最近的一层括号内,在括号外引用便超出了变量的作用范围。

2.3 情况三

指向了函数局部变量。

  #include <iostream>  using namespace std;     int* getval() {      int tmp = 10;      return &tmp;  }     int main()  {      int *p = getval(); //悬空指针      cout<<"*p = "<<*p<<endl;      return 0;  }  

在函数 getval 执行完后,局部变量的内存空间会被释放,而这里 p 指向了函数内的局部变量,p 便成为了悬空指针,可以将 tmp 变为 static 的。

到此这篇关于c++实现野指针和悬空指针的文章就介绍到这了,更多相关c++ 野指针和悬空指针内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享C++野指针和悬空指针的实现方法,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/682940.html

(0)
上一篇 2021年8月8日
下一篇 2021年8月8日

精彩推荐