您的位置:首页 > 编程语言 > C语言/C++

C语言如何防止野指针

2015-04-12 21:13 295 查看
一、野指针
首先,我们先介绍下什么是野指针吧,野指针指指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为 NULL 避免,

<pre name="code" class="cpp">{
    int *p;    //野指针1
    ...
}



2.指针释放之后未置空

有时指针在free或delect后未赋值 NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。

<span style="font-size:18px;">main()
{
    char *p = new char[10];
    delete [] p;              //野指针2
    if (p !=null)             //此处指针p指向任意内存
    {
        ...
    }
}</span>


3.指针操作超过变量的作用域

不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。

示例如下:

int * fun()

{

    int a = 5;

    int * pa = &a;

    return pa;

}

void main()
{
   int *p = fun();                //野指针3</span>

   printf("%d",*p);               //此时*p的值不确定,因为她指向任意值
}


三、避免野指针的方法

1.指针变量一定要初始化为NULL,因为任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的。

2.当指针p指向的内存空间释放时,没有设置指针p的值为NULL。delete和free只是把内存空间释放了,但是并没有将指针p的值赋为NULL,所以当delete或free完后把指针设为NULL。

3.不要返回已经消亡的指针。

总结:我们只能通过养成以上习惯来避免野指针的出现,不然程序出现的bug极难发现和调试出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: