程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [轉載]delete指針之後應該賦值NULL,deletenull

[轉載]delete指針之後應該賦值NULL,deletenull

編輯:C++入門知識

[轉載]delete指針之後應該賦值NULL,deletenull


首先,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


在C++中,指針被delete後而不賦值為NULL,那該指針是什樣的狀態,它有指向的內存空間?

那個指針的值是不變的,也就是還指向你申請來的那塊空間
但是。
即然delete了,那塊空間就不再規你的程序所有了,所以雖然你的那個指針還指向那塊內存空間
但你並不具有對那塊空間的使用權,訪問權。
所以當你在delete後如果試圖使用的話,程序就會崩潰
所以最好賦上NULL,防止你寫程序時不小心引用導致錯誤
 

c語言,一個指針被delete後 賦值NULL,再次delete,這樣做會出錯

首先 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;什麼也不會發生。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved