2016-05-09 80 views
1

如果參考的潛在變量被刪除,會發生什麼?刪除潛在參考

例如,爲什麼下面的代碼是給12作爲輸出我檢查兩對GCC和MSVC

int *x = new int(1); 
int& y = *x; 
delete x; 
x=NULL; 
int z = 12; 
y=z; 
cout<<"Y = "<<y<<endl; 
+2

行爲未定義。 –

回答

4

訪問這個對象的內存已被刪除,是不確定的行爲,不管你是否直接或通過參考做到這一點。

該代碼上GCC輸出12和MSVC在很大程度上不相關的事實:它可以輸出13,或42,或potato並且仍然是符合標準的。

+3

今天早上醒來時,我的浴室鏡子上寫着「馬鈴薯」。我感到害怕,直到我看到這個問答。現在我知道這只是卡皮爾時間旅行UB的結果!唷! –

+0

馬鈴薯使我的一天:D –

0

您在釋放內存後正在訪問內存。這是不明確的。 「未定義」並不意味着程序崩潰,甚至在不同的運行中會發生不同的事情。它僅僅意味着任何事情都可能發生。

不幸的是,當您訪問剛剛發佈的內存時,通常是沒有什麼不好的事情會發生。這正是你所看到的行爲。我懷疑在調試模式下在MSVC中嘗試相同的方式實際上會給你一個不同的結果,因爲它有一些模式,一旦它釋放就銷燬動態內存的內容。

在Linux上,嘗試使用valgrind(查找它)或地址清理程序(使用-sanitize = address編譯)。都遇到這種錯誤。