
空指针、悬空指针、野指针
发布日期:2021-05-04 19:46:42
浏览次数:32
分类:原创文章
本文共 1086 字,大约阅读时间需要 3 分钟。
文章目录
前言
相信很多小伙伴对指针的使用都有一定的了解了。但更多的人可能对指针又爱又恨。这次我们谈点重要的,进一步加深对指针的理解
一、指针?
指针是一种特别变量,全称是指针变量,专用于存放其它变量在内存中的地址编号。把指针指向具体的内存变量的地址,就是对指针赋值。
二、指针的应用场景
用作函数的参数传递和函数的返回值。 利用指针传递参数,可避免变量复制,减少内存开销,提高效率。三、 空指针
没有赋值的指针变量(没有指向内存变量的地址),对空指针操作会造成程序的段错误(Core dump)
四、 悬空指针
指针指向的内存已释放,但指针的值没有被清零,对悬空指针操作的结果不可预知
int main(void) { int*p=nullptr; int*p2=new int; p=p2; delete p2;}
此时p和p2就是悬空指针,指向的内存已经被释放。继续使用这两个指针,行为不可预知。需要设置为p=p2=nullptr。
解决办法:指针free或delete之后及时置空。
五、 野指针
指的是没有被初始化过的指针。
int main(void) { int*p;//未初始化 std::cout<<*p<<std::endl;//未初始化就被使用 return 0;}
因此,为了防止出错,对于指针初始化时都是赋值为nullptr,或置空,这样在使用时编译器就不会直接报错,产生非法内存访问。
正确用法
//关闭文件指针void CFile::Close(){ if(m_fp==0) return;//检查是否为空指针,是则直接返回 fclose(m_fp);//关闭文件指针,这代表着释放了文件指针指向的内存,此时指针就变成了悬空指针 m_fp=0;//将悬空指针的值清零,避免隐藏bug memset(m_filename,0,sizeof(m_filename)); //如果存在临时文件就删除它 if (strlen(m_filenametmp)!=0) remove(m_filenametmp); memset(m_filenametmp,0,sizeof(m_filenametmp));}
总结
对于指针使用大家要格外小心,写程序时仔细考虑清楚。
野指针和悬空指针都是指向无效内存区域(这里的无效指的是"不安全不可控")的指针,访问行为将会导致未定义行为。
避免野指针比较简单,但悬空指针比较麻烦。c++引入了智能指针,C++智能指针的本质就是避免悬空指针的产生。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月08日 23时05分22秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Dubbo学习之简单的demo(xml版)
2019-03-04
Dubbo学习之简单的demo(纯java版)
2019-03-04
SpringBoot之RabbitMQ的简单使用的Demo
2019-03-04
Codeforces Round #672 (Div. 2) 1420A 【思维】 题解
2019-03-04
ES6的Set
2019-03-04
Algorithms Unlocked
2019-03-04
虚拟机VMware安装CentOS8.1系统
2019-03-04
Linux发行版之CentOS8的使用
2019-03-04
python中的map( )函数及lambda()函数简介
2019-03-04
2020-05-26-力扣刷刷4-面试题10- I. 斐波那契数列
2019-03-04
SQL Sever 学习笔记三——聚合查询
2019-03-04
SQL Sever学习笔记四——分组—GROUP BY 子句
2019-03-04
深度优先遍历(DFS)和广度优先遍历(BFS)
2019-03-04
机器学习笔记一——常用优化算法—GD、BGD、SCD、MBGD
2019-03-04
轮播图——旋转木马(Jquery)
2019-03-04
普通平衡树板子
2019-03-04
操作DOM(二):删除节点、、复制节点、替换节点
2019-03-04
刷题笔记--树的遍历
2019-03-04
爬虫(5)—— 获取中国大学排名
2019-03-04