野指针,又称迷途指针,即指向“垃圾”内存的指针。此时指针指向的内存已被操作系统回收,程序已无法再访问。
3)如果指针作为函数的输入参数时,在引用参数前首先对指针进行参数检查。
对比上面两种swap函数的实现方式,可以看出:通过引用实现数值互换时,在函数调用的时候,只需要将两个整数传递给swap函数即可。
野指针,不是NULL指针,而是看上去指向合法内存,却在实际上该内存已经释放。
下面是,预防野指针的几种方法。
1)声明指针时,记得初始化,例如:
char* p=NULL;
2)当指针没有使用价值时,记得释放,释放成功后记得为该指针赋值NULL。例如:
if(NULL != P)
{
delete p;
p = NULL;
}
3)如果指针作为函数的输入参数时,在引用参数前首先对指针进行参数检查。
在函数的入口处使用assert(NULL != p)对参数进行检验,或者用if(NULL != p)来检验。它会提醒指针没有初始化,起到定位错误的功能。assert是一个宏,后面括号里的条件若不满足,则程序会终止运行并提示出错位置。使用完指针后,务必释放该指针所指向的内存。
4)尽量使用引用替代指针。
引用具有指针的功能,同时它还有普通变量的功能。引用对应的变量务必真实存在。引用作为函数的输入参数具有比指针更直接的视觉效果。例如,swap函数的指针实现和引用实现。
//指针实现两数交换
void swap(int *pa,int *pb)
{
int tmp=0;
tmp=*pa;
*pa=*pb;
*pb=tmp;
}
//引用实现两数交换
void swap(int &pa,int &pb)
{
int tmp=0;
tmp=pa;
pa=pb;
pb=tmp;
}
对比上面两种swap函数的实现方式,可以看出:通过引用实现数值互换时,在函数调用的时候,只需要将两个整数传递给swap函数即可。
而通过指针实现数值交换,在函数调用的时候,必须将两整数的地址传递给swap函数。另外如果传递的指针为野指针,其结果不堪设想。
5)使用智能指针,避免野指针。
如果不同对象都需要访问堆上的同一份指针,智能指针可以有效地避免野指针。用智能指针(推荐shared_ptr)进行包装,不同对象可拥有智能指针包装后的指针,每次存取之前使用智能指针的方法_Expired进行指针的有效性检查,如果失败,则表明该对象已经被释放。