本文主要是介绍迷途指针(失控指针) 野指针,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
编程中有一种很难发现的错误是迷途指针。迷途指针也叫悬浮指针(失控指针),是对一个指针进行delete操作后并没有把它设置为空时产生的。在C++中,delete一个指针仅仅是释放它所指向的内存,即把这块内存区标明为可用,而不会改变指针所指向的地址值。而后,你如果没有重新赋值就试图再次使用该指针,引起的结果是不可预料的。
根据前人的经验,在删除指针后小心不要再使用它。虽然这个指针仍然指向原来的内存区域,但是编译器已经将这块内存区域分配给了其他的数据。再次使用这个指针会导致你的程序崩溃。
下面这段代码在网上流行甚传:
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;
尽管使用迷途指针或空指针是非法的,也容易引起程序崩溃,但是空指针导致的程序崩溃是一种可预料的崩溃,这样调试起来就方便得多。
这篇关于迷途指针(失控指针) 野指针的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!