迷途指针与野指针

迷途指针与野指针指的是不指向任何合法的对象的指针。
一:迷途指针的含义
    当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称迷途指针。若操作系统将这部分已经释放的内存重新分配给另外一个进程,而原来的程序重新引用现在的迷途指针,则将产生无法预料的后果。因为此时迷途指针所指向的内存现在包含的已经完全 是不同的数据。通常来说,若原来的程序继续往迷途指针所指向的内存地址写入数据,这些和原来程序不相关的数据将被损坏,进而导致不可预料的程序错误。这种类型的程序错误,不容易找到问题的原因,通常会导致段错误(Linux系统中)和一般保护错误(Windows系统中)。如果操作系统的内存分配器将已经被覆盖的数据区域再分配,就可能会影响系统的稳定性。
二:野指针的含义
    某些编程语言允许未初始化的指针的存在,而这类指针即为野指针。野指针所导致的错误和迷途指针非常相似,但野指针的问题更容易被发现。
三:迷途指针的成因
    在很多编程语言中(如C语言)从内存中删除一个对象或者返回时删除栈帧后,并不会改变相关的指针的值。该指针仍然指向原来的内存地址,即使引用已经删除,现在也可能已经被其它进程使用了。
一个直接的例子,如下所示:


{


   char *cp = NULL;


   /* ... */


   {


       char c;


       cp = &c;


   } /* c 存在于栈中,用完之后c被释放 */          


     /* cp is now adangling pointer */
     // cp = NULL;解决方法
}
上述问题的解决方法是在该部分程序退出之前立即给CP赋0值(NULL)。另一个办法是保证CP在没有初始化之前,将不再被使用。


迷途指针经常出现在混杂使用malloc() 和 free() 库调用: 当指针指向的内存释放了,这时该指针就是迷途的。和前面的例子一样,一个避免这个错误的方法是在释放它的引用后将该指针的值重置为NULL,如下所示:
#include <stdlib.h>


{


    char *cp =malloc ( A_CONST );


    /* ... */


    free ( cp);       /* cp变成危险指针 */


    cp = NULL;        /* CP不再是危险的 */


    /* ... */


}
有个常见的错误是当返回一个基于栈分配的局部变量的地址时,一旦调用的函数返回,分配给这些变量的空间将被回收,此时它们拥有的是"垃圾值"。
int * func ( void )


{


    int num = 1234;


    /* ... */


    return #


}
在调用func之后一段时间,尝试从该指针中读取num的值,可能仍然能够返回正确的值(1234),但是任何接下来的函数调用会覆盖原来的栈为num分配的空间。这时,再从该指针读取num的值就不正确了。如果要使一个指向num的指针都返回正确的num值,则需要将该变量声明为static。
四:野指针的成因
    野指针指的是还没有初始化的指针。严格地说,编程语言中每个指针在初始化前都是野指针。
int f(int i)    
{  
  
    char* cp;         //cp 是野指针,cp指向一个不知道的地址   
  
    static char*scp;  //scp is not a wild pointer: staticvariables are initialized to 0   
  
                      //at start and retain their values from the last call afterwards.   
  
                      //Using this feature may be considered bad style if not commented   
}  //static 是发在数据段的
五:迷途指针的检测
    为了能发现迷途指针,一种普遍的编程技术——一旦指针指向的内存空间被释放,就立即把该指针置为空指针或者为一个非法的地址。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值