首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 迷途指针浅谈
【标  题】:迷途指针浅谈
【关键字】:
【来  源】:http://blog.csdn.net/AmiRural/archive/2007/01/20/1488402.aspx

迷途指针浅谈

       编程中有一种很难发现的错误是迷途指针。迷途指针也叫悬浮指针(失控指针),是对一个指针进行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;
      尽管使用迷途指针或空指针是非法的,也容易引起程序崩溃,但是空指针导致的程序崩溃是一种可预料的崩溃,这样调试起来就方便得多。

 

CRC16/CRC32/CRC16F算法和MD5加密算法:【上一篇】
曲目四:附录、“变态”C代码的手工阅读:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 原创软件:腾讯 QQ2006 Beta2 SP3 珊瑚虫VIP美化绿色版(苹果图标)
  • 电子注册的演示软件
  • C#算法(一)选择排序
  • FreeBSD 中文编码转换
  • 网站设计素材网址
  • 欢迎光临DBA中国论坛www.dbacn.com
  • X windows系统使用指南(五)
  • 软件开发=战争
  • spring的事务处理详解:事务创建
  • Encyrptpe 2003.5.18主程序Unpacking tut
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.