C++每日一问9:关于野指针
1.什么是野指针
野指针(wild pointer),也就是指向了一个未知位置的指针,解引用一个野指针就是访问一个不确定的地址,获取一个不确定的结果。
2.野指针的成因
野指针的成因一般有三种:
1.指针变量声明时未初始化
int main()
{
int* a ; //定义指针时,未初始化,指针指向随机地址
cout << "a:"<<a<<ends<<"*a:"<<*a<<endl; //使用为初始化的指针,error
return 0;
}
2.指针释放后未置空
int main()
{
int* a = new int(2);
delete a; //释放指针后没有将指针置为空,随后继续使用该指针,error
cout << "a:"<<a<<ends<<"*a:"<<*a<<endl;
return 0;
}
3.指针操作超越变量作用域。不要用指针指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。此时,指针就会指向一个未知的地址。
int* func(int a) //返回了一个临时变量的地址,函数当时可能会正确运行。但接下来的任何函数调用都会覆盖num的地址,
{ //这时再读取num的值就不正确了
int num = a;
return #
}
int main()
{
int* a = fun(3);
cout << *a << endl;
int* b = fun(4);
cout << *a << endl;
return 0;
}
2.与悬垂指针(Dangling pointer)的区别
悬垂指针也叫迷途指针,其实也可以看作野指针。如果非要做出区别,那么悬垂指针是指,当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址。而野指针是指,未经初始化的指针。这里没有必要太计较。
3.如何避免野指针
- 最大的建议就是,有条件时使用封装更加完善的智能指针。
- 养成良好编程习惯。定义指针时一定要初始化;释放指针所指向的内存空间时,同时也要置指针为NULL;