野指针形成原因:
1:未初始化
我们知道一个指针变量在创建的时候并不是NULL,它的缺省值是随机的,也就是说它可以乱指一通,所以在创建指针时应该初始化,要么将其设置为NULL,要么将其指向一块合法的内存!
2:指针释放后未置空
指针指向的对象主动释放(free,delete)后未及时置空,指针释放只是释放该段内存,指针本身并没有释放,此时指针指向的内存就是垃圾内存,所以释放后应该马上将指针置空。
3:作用域后使用指针
不要返回栈内的指针或者引用,栈内存在离开函数或者作用域的时候会被释放。例子如下:
int main()
{
int *p=NULL;
{
int tem=10;
p=&tem;
cout<<"address of p:"<<p<<endl;
cout<<"p="<<*p<<endl;
}/**/
int b=100;
cout<<"address of b:"<<&b<<endl;
cout<<"address of p:"<<p<<endl;
cout<<"p="<<*p<<endl;
return 0;
}
结果如下:
address of p:0x7ffffd37846c
p=10
address of b:0x7ffffd37846c
address of p:0x7ffffd37846c
p=100
分析:p在作用域内指向的是tem(值10),但是tem在离开作用域后释放了,此时p变为野指针。之后b的栈内存地址就是原来tem被释放的地址,所以p指向的内存值变为100。