1.野指针的概念
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的);相当于指针指向非法的内存空间。指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。
2.野指针产生原因:
- 指针变量未初始化
任何指针变量刚被创建时不会被自动置为NULL,它的缺省值是随机的,所以这块内存,所以指针变量在创建时,要么初始化让它指向一块合法的内存,要么置为NULL。
#include <stdio.h>
int main()
{
int *p;//局部变量指针未初始化,默认为随机值
*p = 20;
return 0;
}
- 指针越界访问
#include <stdio.h>
int main()
{
int arr[10] = {0};
int *p = arr;
int i = 0;
for(i=0; i<=11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
}
- 指针指向的内存释放后之后未置空
指针指向的内存被free或者delete释放后,指针的值仍然为刚刚被释放的那块内存的首地址,但是此时指针已经失去了对那块内存的合法访问权限。此时指针指向的就是“垃圾”内存,因此内存释放后的指针应立即将指针置为NULL,防止产生“野指针”。
3.野指针会造成什么后果呢?
///可能会导致内存泄漏。
什么叫作内存泄漏?
指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
内存泄漏分为两方面:1.非法访问空间 2.访问了已经释放的空间
(野指针不是一定会导致内存泄露,如果该野指针指向的内存刚好是某个变量的地址,那么野指针也能使用这块内存)
4.如何规避野指针
- 指针初始化
指针变量一定要初始化为NULL,因为任何指针变量(除了static修饰的指针变量)刚被创建时不会自动成为NULL指针,它的缺省值是随机的。 - 防止指针越界
- 指针指向内存空间释放后及时置NULL
- 指针使用之前检查有效性;使用之前将其赋值绑定给一个可用地址空间。
- C++引入了引用机制,如果使用引用可以达到编程目的,就可以不必使用指针。因为引用在定义的时候,必须初始化,所以可以避免野指针的出现。