计算机系统应用教程网站

网站首页 > 技术文章 正文

野指针有多野

btikc 2024-09-12 12:06:33 技术文章 9 ℃ 0 评论

对编程小白来说,一提起指针就有种莫名的恐惧感,从刚开始学习的时候就被老师灌输的概念是指针功能很强大,但是用得不够好,会有很大的副作用。

什么叫用得够好?初学者谁都不会用,那且不是都不能用了?如果都这样,指针都没人用了,还要指针做什么?陷入了上述困局的原因在于我们的这种莫名的恐惧感,指针如此之神秘,以至于如我一样大多数的人都望而生畏,无所适从,被迫放弃。

一、再说野指针

野指针指指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为 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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表