首页 > 代码库 > 预防野指针的几种方法

预防野指针的几种方法

       野指针,又称迷途指针,即指向“垃圾”内存的指针。此时指针指向的内存已被操作系统回收,程序已无法再访问。

       野指针,不是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进行指针的有效性检查,如果失败,则表明该对象已经被释放。



预防野指针的几种方法