迷途指针浅谈

       编程中有一种很难发现的错误是迷途指针。迷途指针也叫悬浮指针(失控指针),是对一个指针进行delete操作后并没有把它设置为空时产生的。在C++中,delete一个指针仅仅是释放它所指向的内存,即把这块内存区标明为可用,而不会改变指针所指向的地址值。而后,你如果没有重新赋值就试图再次使用该指针,引起的结果是不可预料的。
      根据前人的经验,在删除指针后小心不要再使用它。虽然这个指针仍然指向原来的内存区域,但是编译器已经将这块内存区域分配给了其他的数据。再次使用这个指针会导致你的程序崩溃。
   
下面这段代码在网上流行甚传:(蓝色部分为附加代码,用做测试)

     1     typedef unsigned short int USHORT;  
     2     #include   <iostream.h>  
     3  
     4     int   main()  
     5     {  
     6         USHORT *pInt = new USHORT;  
     7         *pInt=10;
     8         cout<<pInt<<endl; 
     9         cout<<"*pInt: "<<*pInt<<endl;  
     10        delete pInt;   //pInt为一迷途指针!
     11
     12        long *pLong = new long;
     13        cout<<pInt<<endl;  
     14        cout<<pLong<<endl;
     15        *pLong=90000;  
     16        cout<<"*pLong: "<<*pLong<<endl;  
     17  
     18        *pInt=20;      //再次使用pInt! 

     19        cout<<"*pInt: "<<*pInt<<endl;  
     20        cout<<"*pLong: "<<*pLong<<endl;  
     21        delete   pLong;  
     22        return   0;  
     23    }
程序输出的结果为:
               0x00430070
               *pInt:10
               0x00430070
               0x00430070
               *pLong:9000
               *pInt:20
               *pLong:65556
      由程序结果可知,尽管使用delete将pInt指针删除,并重新声明一个新的指针pLong,但是它们都指向一个相同的地址,即pInt仍然指向这块内存区域。程序15行把9000赋值给pLong后,它的实际存储为(5F 90 00 01)16。当把20赋值给迷途指针pInt时,也就是把(00 14)16赋值给pInt所指向的内存区域,也是pLong所指向的内存。因此,pLong的前2个字节被覆盖了,变成了00 14 00 01,所以打印的结果变成了65556。
      通常,如果在删除一个指针后又把它删除一次,程序就会变得非常不稳定,任何情况都有可能发生。但是如果你只是删除了一个空指针,则什么事情都不会发生,这样做非常安全。所以,大部分情况下,我们应该把迷途指针该为空指针。在程序的11行加入语句:pInt=0;
      尽管使用迷途指针或空指针是非法的,也容易引起程序崩溃,但是空指针导致的程序崩溃是一种可预料的崩溃,这样调试起来就方便得多。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值