所謂迷途指針(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