野指针,不是NULL指针,而是看上去指向合法内存,却在实际上该内存已经释放。
下面是,预防野指针的几种方法。
1)声明指针时,记得初始化,例如:
char* p=NULL;
2)当指针没有使用价值时,记得释放,释放成功后记得为该指针赋值NULL。例如:
if(NULL != P) { delete p; p = NULL; }
在函数的入口处使用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函数。另外如果传递的指针为野指针,其结果不堪设想。
5)使用智能指针,避免野指针。
如果不同对象都需要访问堆上的同一份指针,智能指针可以有效地避免野指针。用智能指针(推荐shared_ptr)进行包装,不同对象可拥有智能指针包装后的指针,每次存取之前使用智能指针的方法_Expired进行指针的有效性检查,如果失败,则表明该对象已经被释放。
原文地址:http://blog.csdn.net/sanqima/article/details/41807035