野指针的产生及其危害

野指针的产生及其危害

Guderian出品


野指针指向了一块随机内存空间,不受程序控制。如指针指向已经被删除的对象或者指向一块没有访问权限的内存空间,之后如果对其再进行引用的话,就会出现问题。

成因

指针变量未初始化

任何指针变量(无static修饰的局部变量)刚被创建时不会自动成为*NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。如果没有初始化,编译器会报错。

注:NULL指针是一个定义在标准库中的值为零的常量,其定义为:

1
#define NULL ((void *)0)

指针释放之后未置空

又是指针在freedelete后未赋值NULL,便会使人以为是合法的。然而freedelete只是把指针所指的内存给释放掉,并没有把指针本身干掉。此时指针指向的是随机内存空间。释放指针后应立即将指针置为NULL,防止产生野指针。

指针操作超越变量作用域

返回或引用指向*栈内存的指针,因为栈内存在函数结束的时候会被释放


后果

  • 指向不可访问地址,造成程序异常终止
  • 指向可用空间,但是这块空间不适用,程序正常运行
  • 指向可用空间,但是这块空间刚好在用,造成数据错误

规避

初始化时置NULL

指针变量一定要初始化为NULL,因为任何指针变量(无static修饰的局部变量)刚被创建时不会自动成为NULL指针,它的缺省值是随机的。

释放时置NULL

当指针p指向的内存空间释放时,没有设置指针p的值为NULLdeletefree只是把内存空间释放了,但是并没有将指针p的值赋为NULL。通常判断一个指针是否合法,都是使用if语句测试该指针是否为NULL。例如(针对C++):

1
2
3
int *p = new int(6);
delete p;
if(p != NULL) *p = NULL;

或者使用宏定义来一次性解决问题:

1
#define del(x) delete(x); x = NULL

本文标题:野指针的产生及其危害

文章作者:G-SS-Hacker

发布时间:2019年08月05日 - 16:46:38

最后更新:2019年10月21日 - 18:55:02

原始链接:https://G-SS-Hacker.github.io/野指针的产生及其危害/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。