网站首页 > java教程 正文
对编程小白来说,一提起指针就有种莫名的恐惧感,从刚开始学习的时候就被老师灌输的概念是指针功能很强大,但是用得不够好,会有很大的副作用。
什么叫用得够好?初学者谁都不会用,那且不是都不能用了?如果都这样,指针都没人用了,还要指针做什么?陷入了上述困局的原因在于我们的这种莫名的恐惧感,指针如此之神秘,以至于如我一样大多数的人都望而生畏,无所适从,被迫放弃。
一、再说野指针
野指针指指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为 NULL避免,而只能通过养成良好的编程习惯来尽力减少。诚如当初老师的忠告一样, 指针是个很强大的工具,可是正因为它太强大,所以要操作它不是件易事。操作不当造成的野指针,甚至会引起系统死机等比较严重的后果。
二、成因
指针变量未初始化
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
指针释放后之后未置空
有时指针在free或delete后未赋值NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。
指针操作超越变量作用域
不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
三、危害
造成系统输出错误,严重的可以造成系统崩溃。
四、规避
通常避免野指针的办法是正确的使用指针
声明一个pointer的时候注意初始化为null :
int* pInt = NULL;
分配完内存以后注意ASSERT:
pInt = new int[num];
ASSERT(pInt != NULL);
删除时候注意用对操作符:
对于new int类型的,用delete
对于new int[]类型的,用delete []
删除完毕以后记得给他null地址:
delete []pInt;
pInt = NULL;
记住,谁分配的 谁回收,不要在一个函数里面分配local pointer,送到另外一个函数去delete。
返回local address是非常危险的,如必须这样做,请写注释到程序里面,免得忘记。
本文部分内容来自江上一舟 blog
大家如果对编程感兴趣,想了解更多的编程知识,解决编程问题,我们这里有java高手,C++/C高手,windows/Linux高手,android/ios高手,请大家关注我的微信公众号:程序员互动联盟 coder_online
猜你喜欢
- 2025-03-30 用最通俗易懂的方式给你讲明白NullPointerException
- 2025-03-30 什么是“指针变量”?它为什么如此重要?
- 2025-03-30 知道空指针,你也能改bug了(空指针的问题怎么解决)
- 2025-03-30 「Java」一张图教会你关于null的几种处理方式(内附代码)
- 2025-03-30 Java中NullPointerException的完美解决方案
- 2025-03-30 java新特性之Optional类介绍,解决空指针问题的终极类
- 2025-03-30 java catch 空指针异常_关于Java:捕获空指针异常
- 2025-03-30 没用 Java 8,怎么优雅地避免空指针?
- 2025-03-30 告别空指针-Kotlin这一点把Java比下去了
- 2025-03-30 java 中如何避免空指针(java中空指针异常的原因)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)