迷途指针(失控指针) 野指针

 

编程中有一种很难发现的错误是迷途指针。迷途指针也叫悬浮指针(失控指针),是对一个指针进行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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值