对编程小白来说,一提起指针就有种莫名的恐惧感,从刚开始学习的时候就被老师灌输的概念是指针功能很强大,但是用得不够好,会有很大的副作用。
什么叫用得够好?初学者谁都不会用,那且不是都不能用了?如果都这样,指针都没人用了,还要指针做什么?陷入了上述困局的原因在于我们的这种莫名的恐惧感,指针如此之神秘,以至于如我一样大多数的人都望而生畏,无所适从,被迫放弃。
一、再说野指针
野指针指指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为 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
本文暂时没有评论,来添加一个吧(●'◡'●)