所谓迷途指针(C中的野指针,C++中的迷途指针(失控指针或悬浮指针)),是指将delete 用于指针(从而释放它指向的内存),但没有将它设置为空时引起的。ios
例如,当咱们定义一个指针的时候:spa
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指针,它也不指向合法的内存块。code
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 }
以上程序输出结果为:blog
0x7f9330c026e0
*pInt:10
0x7f9330c026e0
0x7f9330c026e0
*PLong:90000
*PInt:20
*PLong:20内存
能够看到PInt在删除以前是0x7f9330c026e0,删除以后仍是0x7f9330c026e0,而且和PLong指向相同的内存地址。io