首先,C++標准規定:delete空指針是合法的,沒有副作用。
但是,delete p後,只是釋放了指針指向的內存空間。p並不會自動被置為NULL,而且指針還在,同時還指向了之前的地址。
問題來了,對一個非空指針delete後,若沒有賦NULL,若再次delete的話,有可能出現問題。
如下代碼
int *p = new int(3); delete p; delete p;
用VC編譯運行將出現問題。
將其改為:
int *p = new int(3); delete p; p = NULL; delete p;
則不會出現問題(因為delete空指針是合法的)
所以,為了避免出現問題,指針被delete之後應該賦值NULL
那個指針的值是不變的,也就是還指向你申請來的那塊空間
但是。
即然delete了,那塊空間就不再規你的程序所有了,所以雖然你的那個指針還指向那塊內存空間
但你並不具有對那塊空間的使用權,訪問權。
所以當你在delete後如果試圖使用的話,程序就會崩潰
所以最好賦上NULL,防止你寫程序時不小心引用導致錯誤
首先 c語言中沒有delete c語言中有的是free free一個null的結果是未定義的
因此這樣使用的結果就是 編譯器想怎麼干就怎麼干 你不知道發生了什麼.
根據目前的C++草案,Working Draft, Standard for Programming Language C++
Working Draft, Standard for Programming Language C++ 寫道
5.3.5
(6): If the value of the operand of the delete-expression is not a null
pointer value, the delete-expression will invoke the destructor (if
any) for the object or the elements of the array being deleted. In the
case of an array, the elements will be destroyed in order of decreasing
address (that is, in reverse order of the completion of their
constructor; see 12.6.2).
如果不是空指針就調用析構函數。換句話說delete NULL;什麼也不會發生。