指向釋放位置的指針它是一個未定義的行爲?指向釋放位置的指針是否爲未定義行爲?
int *p = new int;
*p = 10;
delete p;
*p = 10;
cout << *p << endl;
指向釋放位置的指針它是一個未定義的行爲?指向釋放位置的指針是否爲未定義行爲?
int *p = new int;
*p = 10;
delete p;
*p = 10;
cout << *p << endl;
僅存在指向釋放位置的指針本身並不是未定義的行爲。試圖取消引用該指針確實會產生未定義的行爲。
當您分配內存,以使新的指針,當你在第一線做
int *p = new int;
你問操作系統產生一些內存供您使用,只要你喜歡。然後你可以把東西在這個位置,你然後做
*p = 10;
該內存可爲你,只要你想使用,然後你就可以告訴操作系統你用它做,由調用delete
,就像你在下一行所做的那樣。
delete p;
操作系統現在擁有可用的內存,但它可能會或可能不會對該內存執行某些操作。如果你分配了一堆其他內存,則可能是新內存範圍包含此內存。操作系統可能會把這個內存給別的東西,或者它可能不會 - 它不會告訴你,這就是爲什麼它被說成是未定義的行爲仍然在內存中使用該地方。
*p = 10;
然後,您可以重新使用此位置的內存將其重新設置爲10。在此期間沒有其他事情發生,這是一個相當平凡的程序,所以操作系統還沒有對該塊內存做任何其他操作,所以在這種情況下設置它沒有任何更大的影響。
cout << *p << endl;
再次,操作系統擁有記憶的權利,但它不太可能在這一點上做的任何事的;這就像在您的住宿正式結束後入住酒店房間。您可能會也可能不會呆在那裏,因爲您不知道房間之後是否正在被其他人使用,或房間是否空着。你可能會被拋出,或者你可能是安全的。
這是未定義的行爲:
如果在標準庫給一個釋放函數的參數是一個指針,是不是空指針值時,釋放功能應解除分配指針所引用的存儲,渲染無效的所有指針指向解除分配的存儲的任何部分。使用無效指針值(包括將它傳遞給釋放函數)的效果未定義。 - C++ '03 3.7.3.2
是的。下一個問題? –
當我在我的詞典中查找單詞'Undefined'時,我沒有看到任何含義的「崩潰」... – Mehrdad
爲什麼它不是一個真正的問題!我真的不知道這是不是UB ...我們的演講告訴我們這不是UB .... – faressoft