迷途指針

迷途(stray)指針,也被稱為野(wild)指針或懸浮(dangling)指針,是指將delete 用於指針(從而釋放它指向的記憶體),但沒有將它設定為空時引發。

迷途(stray)指針,也被稱為野(wild)指針或懸浮(dangling)指針,是指將delete 用於指針(從而釋放它指向的記憶體),但沒有將它設定為空時引發。如果隨後你在沒有重新賦值的情況下使用該指針,後果將是不可預料的:程式崩潰算你走運。
這個程式故意創建了一個迷途指針:
typedef unsigned short int USHORT;
#include <iostream>
int main ()
{
USHORT *pint = new USHORT ;
*pInt = 10 ;
std::cout << "pInt:" << *pInt << std::endl ;
delete pInt ;
long *pLong = new long ;
*pIong = 90000 ;
std::cout << "*pLong:" << *pLong << endl ;
*pInt = 20 ;
std::cout << "pInt:" << *pInt << std::endl ;
*pInt = 20 ;
std::cout << "*pInt:" << *pInt << endl ;
std::cout << "*pLong:" << *pInt << endl;
delete pLong ;
return 0 ;
}
輸出:
*pInt:10
*pLong:90000
*pInt:20
*pInt :65556
pInt聲明為一個USHORT指針,並將其指向使用new分配的記憶體,將10存儲到pInt指向的記憶體中,對指針使用delete後,pInt將成為一個迷途指針。
接著聲明了一個新的指針pLong,它指向new分配的記憶體,將90000存儲到pLong指向的記憶體中。它指向的是pInt原來指向的記憶體塊,帶來麻煩的是 pInt = 20,它將20賦值到pInt原先指向的記憶體,(pInt被釋放後不再指向任何合法的記憶體,它仍可能指向原來的記憶體塊)將覆蓋pLong指向的記憶體。這被稱為重踏指針,它通常是使用迷途指針產生的不幸後果。
總之。對指針使用delete後就不要再使用它。雖然這個指針仍指向原來的記憶體區域,但編譯器可能已經將其他數據存儲在這裡。不重新給這個指針複製就再次使用它可能導致程式崩潰;更糟糕的是,程式可能表面上運行正常但是過不了幾分鐘後就崩潰了。這被稱為定時炸彈,可不是好玩的。為了安全起見,刪除指針後,
把其設定為空.這樣便解除了它的武裝。

相關詞條

相關搜尋

熱門詞條

聯絡我們