一、什么是野指针?
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的),指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。
二、为什么有野指针?
1、指针定义时未被初始化:指针在被定义的时候,如果不对其进行初始化的话,它会随机指向一个区域,因为任意指针变量,它的默认值都是随机的;
2、指针被释放时没有置空:我们使用new开辟内存空间的时,需要检查返回值是否为空,如果为空,则开辟失败;如果不为空,则指针指向的是开辟的内存空间的首地址。指针指向的内存空间在用 delete 释放后,如果没有对其进行置空或者其他赋值操作的话,就会成为野指针;
3、指针操作超越变量作用域:不要返回指向栈内存的指针或者引用,因为栈内存在函数结束的时候会被释放。
三、野指针有什么危害?
当一个指针成为了野指针,他的指向就是随机的,当你使用了一个指向随机地址的指针时,他的危害程度也是随机的,不可预测的,它一般会造成内存泄漏,而且很容易遭受到黑客还有病毒的攻击。
内存泄漏:
是由于疏忽或错误造成程序没有及时释放已经不使用的内存情况。内存泄漏并不是物理意义上的内存消失,而是由于程序分配了一段内存后,并不能对这段内存进行控制,造成了内存的浪费。
四、如何避免野指针?
1、养成良好的编程习惯;
2、定义指针时,要进行初始化,如果没有确定的值,就让它指向NULL。因为NULL在宏定义是#define NULL (void **) 0 它代表的是零地址,零地址是不能进行任何读写操作的;
3、当要给指针指向的空间进行赋值时,要检查有没有给这个指针分配空间;
4、要将申请好的空间进行初始化操作,因为这段空间可能会存在之前数据的残留,会对程序造成影响。可以用 memset (p,0,sizeof(int))将指针指向的空间都置为0;
5、使用完指针要及时将指针释放,与 new 所对应的为delete ;
6、释放完成后要将指针指向NULL,否则会生成野指针。