所谓迷途指针(C中的野指针,C++中的迷途指针(失控指针或悬浮指针)),是指将delete 用于指针(从而释放它指向的内存),但没有将它设置为空时引发的。
例如,当我们定义一个指针的时候:
1 void main() 2 { 3 int *p; 4 }
p的值为0xcccccccc。也就是说,任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。这也就是为什么我们在指针一开始创建时就给它赋一个值总是没有错的。
指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。free和delete只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。
1 #include <iostream> 2 using namespace std; 3 4 int main() { 5 int *PInt=new int; 6 *PInt=10; 7 cout<<PInt<<endl; 8 cout<<"*pInt:"<<*PInt<<endl; 9 delete PInt; 10 // PInt= NULL;//如果没有这句,PInt就成了迷途指针 11 12 int *PLong=new int; 13 cout<<PInt<<endl; 14 cout<<PLong<<endl; 15 *PLong=90000; 16 cout<<"*PLong:"<<*PLong<<endl; 17 18 *PInt=20;//再次使用PInt,如果是迷途指针则会出现未知错误,加了PInt= NULL则直接会报错(至少知道是错了)。(delete过的指针不应该再使用) 19 20 cout<<"*PInt:"<<*PInt<<endl; 21 cout<<"*PLong:"<<*PLong<<endl; 22 23 delete PLong; 24 25 return 0; 26 }
以上程序输出结果为:
0x7f9330c026e0
*pInt:10
0x7f9330c026e0
0x7f9330c026e0
*PLong:90000
*PInt:20
*PLong:20
可以看到PInt在删除之前是0x7f9330c026e0,删除之后还是0x7f9330c026e0,并且和PLong指向相同的内存地址。