2012-05-19 27 views
-6

指向釋放位置的指針它是一個未定義的行爲?指向釋放位置的指針是否爲未定義行爲?

http://ideone.com/Qp3uY

int *p = new int; 

*p = 10; 

delete p; 

*p = 10; 

cout << *p << endl; 
+8

是的。下一個問題? –

+0

當我在我的詞典中查找單詞'Undefined'時,我沒有看到任何含義的「崩潰」... – Mehrdad

+0

爲什麼它不是一個真正的問題!我真的不知道這是不是UB ...我們的演講告訴我們這不是UB .... – faressoft

回答

4

解引用一個指針刪除是一個未定義的操作。不要這樣做。

+0

指針stil指的是正確的位置! – faressoft

+4

有可能不再有*位置 - 操作系統可能會從虛擬內存空間中刪除地址。 –

6

僅存在指向釋放位置的指針本身並不是未定義的行爲。試圖取消引用該指針確實會產生未定義的行爲。

0

當您分配內存,以使新的指針,當你在第一線做

int *p = new int; 

你問操作系統產生一些內存供您使用,只要你喜歡。然後你可以把東西在這個位置,你然後做

*p = 10; 

該內存可爲你,只要你想使用,然後你就可以告訴操作系統你用它做,由調用delete,就像你在下一行所做的那樣。

delete p; 

操作系統現在擁有可用的內存,但它可能會或可能不會對該內存執行某些操作。如果你分配了一堆其他內存,則可能是新內存範圍包含此內存。操作系統可能會把這個內存給別的東西,或者它可能不會 - 它不會告訴你,這就是爲什麼它被說成是未定義的行爲仍然在內存中使用該地方。

*p = 10; 

然後,您可以重新使用此位置的內存將其重新設置爲10。在此期間沒有其他事情發生,這是一個相當平凡的程序,所以操作系統還沒有對該塊內存做任何其他操作,所以在這種情況下設置它沒有任何更大的影響。

cout << *p << endl; 

再次,操作系統擁有記憶的權利,但它不太可能在這一點上做的任何事的;這就像在您的住宿正式結束後入住酒店房間。您可能會也可能不會呆在那裏,因爲您不知道房間之後是否正在被其他人使用,或房間是否空着。你可能會被拋出,或者你可能是安全的。

3

這是未定義的行爲:

如果在標準庫給一個釋放函數的參數是一個指針,是不是空指針值時,釋放功能應解除分配指針所引用的存儲,渲染無效的所有指針指向解除分配的存儲的任何部分。使用無效指針值(包括將它傳遞給釋放函數)的效果未定義。 - C++ '03 3.7.3.2

相關問題