p所指的空間。
比如 int* p = new int(1);
delete p;
就會在堆上分配一塊內存,當作int類型使用,並賦值為1,將其地址儲存在棧上的int*類型的p里。delete p會釋放p所指向的內存。而這里p為一自動變量,其本身在程序退出其作用域時銷毀。
用delete命令處理某個指針,說是把那個指針刪除了是不正確的。
delete命令指示釋放了那個指針原本所指的那部分內存而已。被delete后的指針p的值(地址值)並非就是NULL,而是隨機值。
也就是被delete后,如果不再加上一句p=NULL,p就成了“野指針”,在內存里亂指一通。
如果在定義p的那個函數在delete了p后,沒再調用p,就沒什么問題,在這個函數結束后,p就會跟其它變量一樣被消除。但若在那個函數里delete了p后,又沒再給p賦值(地址值),再次調用p就危險了,因為這時p在內存里亂指,有可能指到一些重要地址,隨時可能系統崩潰。
//p=NULL是個好習慣
//就像你蹲完廁所要洗手一樣
《問題》危險的代碼:
   int* p=new int(1);
   delete p;
   delete p;
探討一:
連續兩次對同一個指針delete ,會造成嚴重的錯誤。編譯器會檢測出這樣的錯誤嗎?或許一些編譯器會的,但別太過指望編譯器。
探討二:
第一次delete后,p自動為空(NULL)了嗎?不是的。
探討三:
在delete之前會自動檢查p是否為空(NULL),如果為空(NULL)就不再delete了嗎?確實是如此。
探討四:
刪除為空(NULL)的指針是不會有任何問題的嗎?確實是如此。
探討五:
#define SAFE_DELETE(p) delete (p); p = 0;
這樣就就萬事大吉了嗎?好像不是的。
delete p+1;//在C++中是正確的
SAFE_DELETE(p+1)將會導致錯誤
探討六:
沒有好的方法解決重復釋放這樣的問題,只能靠程序員的細心了。
《結論》安全的代碼:
   int* p=new int(1);
   delete p;
   p = NULL;
(1)delete 一次以后,p成了野指針,它作為地址的值還是有效地沒還可以訪問它以前指向的內存,不過那片內存被重新格式化了;
(2)p不等於NULL,用 if(p) 語句不能判斷它指向的內存是否有效(此時它指向的內存無效,p本身有效);
(3)delete 一次以后,不能再次delete,否則會報錯;
(4)此時如果誤用p指針,仍然可以修改內存的值和從該處取出數值,但此時數據不受保護,該內存空間可能被重新被分配給別的變量;
(5)如果p指向的空間再次被new函數分配,即使是分配給別的指針,即使分配大小與原來不一樣,p又恢復了效力,可以改變內存的值,甚至可以重新被delete,p的作用與新分配的指針一樣;
