野指针的产生及其危害
Guderian出品
野指针指向了一块随机内存空间,不受程序控制。如指针指向已经被删除的对象或者指向一块没有访问权限的内存空间,之后如果对其再进行引用的话,就会出现问题。
成因
指针变量未初始化
任何指针变量(无static
修饰的局部变量)刚被创建时不会自动成为*NULL
指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL
,要么让它指向合法的内存。如果没有初始化,编译器会报错。
注:NULL
指针是一个定义在标准库中的值为零的常量,其定义为:
1 |
指针释放之后未置空
又是指针在free
或delete
后未赋值NULL
,便会使人以为是合法的。然而free
和delete
只是把指针所指的内存给释放掉,并没有把指针本身干掉。此时指针指向的是随机内存空间。释放指针后应立即将指针置为NULL,防止产生野指针。
指针操作超越变量作用域
返回或引用指向*栈内存的指针,因为栈内存在函数结束的时候会被释放
后果
- 指向不可访问地址,造成程序异常终止
- 指向可用空间,但是这块空间不适用,程序正常运行
- 指向可用空间,但是这块空间刚好在用,造成数据错误
规避
初始化时置NULL
指针变量一定要初始化为NULL
,因为任何指针变量(无static
修饰的局部变量)刚被创建时不会自动成为NULL
指针,它的缺省值是随机的。
释放时置NULL
当指针p
指向的内存空间释放时,没有设置指针p
的值为NULL
。delete
和free
只是把内存空间释放了,但是并没有将指针p
的值赋为NULL
。通常判断一个指针是否合法,都是使用if
语句测试该指针是否为NULL
。例如(针对C++):
1 | int *p = new int(6); |
或者使用宏定义来一次性解决问题:
1 |