C++野指针和悬空指针的实现方法
作者:Linux猿 发布时间:2022-11-02 08:26:56
目录
一、野指针
二、悬空指针
2.1 情况一
2.2 情况二
2.3 情况三
野指针和悬空指针是指针中常见的两个概念,本文结合实例讲解来讲解下。
一、野指针
野指针是指尚未初始化的指针,既不指向合法的内存空间,也没有使用 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 的。
来源:https://blog.csdn.net/nyist_zxp/article/details/119478944


猜你喜欢
- 目录前言一、技术介绍1.ReentranReadWriteLock是什么?二、源码分析1.ReadLock2.WriteLock三、单元测试
- 本文实例为大家分享了java实现学生成绩管理系统的具体代码,供大家参考,具体内容如下/* *@copyright by LzyRa
- 装箱(boxing)和拆箱(unboxing)是C#类型系统的核心概念.是不同于C与C++的新概念!,通过装箱和拆箱操作,能够在值类型和引用
- 枚举的基本用法回顾以下是一个常见的 C# 枚举(enum)的示例:enum Weekday{
- 本节讲运行在后台服务里的工作请求,如何向发送请求者报告状态。推荐用LocalBroadcastManager发送和接收状态,它限制了只有本a
- 在本文中,我将向你展示c#编程的5个最佳实践。我从日常编程经验中学到了这些实践。我在release模式下测试了所有的代码,并在开发环境稳定后
- 本文实例讲述了Android编程中沉浸式状态栏的三种实现方式。分享给大家供大家参考,具体如下:沉浸式状态栏Google从android ki
- 这篇文章主要介绍了mybatis使用pagehelper插件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 在面向对象设计原则中,要求"要依赖于抽象,不要依赖于具体", 这句话有很多人搞不懂。在这里谈谈我自己的理解。首先看看以下
- 路由事件模型传统的简单事件模型中,在消息激发是将消息通过事件订阅的然后交给事件的相应者,事件的相应者使用事件的处理器来做出相应,这样就存在一
- 本文的主要内容包括在下图,下面来一起看看吧。1、&和&&的区别2、switchswitch语句能否作用在byte,能
- 归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序
- string fileExt = Path.GetExtension(excelPath);string conn = "&quo
- 前言:sleep 方法和 wait 方法都是用来将线程进入休眠状态的,并且 sleep 和 wait 方法都可以响应 interrupt 中
- 阿里云accessID和secret请自行进入阿里云申请sms.template.code请进入阿里云,进行短信服务进行魔板添加开源代码地址
- 本文实例为大家分享了Android实现五子棋游戏的具体代码,供大家参考,具体内容如下直接上效果图原理从棋盘到棋子,到开始下棋的各类点击事件,
- 文章描述在前面两篇写完了对于GIF动态图片的分割和合成,这一篇来写下将视频文件分割成一帧帧图片的方法。开发环境.NET Framework版
- IoC的概念介绍控制反转(IOC)模式(又称DI:Dependency Injection)就是Inversion of Control,控
- 本文为大家分享了C#导入导出Excel数据的具体代码,供大家参考,具体内容如 * :对于实体类对象最好新建一个并且继承原有实体类,这样可以将类
- 此篇文章内容仅限于 描述 thy3.0 自定义标签的说明,所以你在看之前,请先会使用它。直奔主题,以下代码是如何引用 第三方标签的。说明: