如果參考的潛在變量被刪除,會發生什麼?刪除潛在參考
例如,爲什麼下面的代碼是給12作爲輸出我檢查兩對GCC和MSVC
int *x = new int(1);
int& y = *x;
delete x;
x=NULL;
int z = 12;
y=z;
cout<<"Y = "<<y<<endl;
如果參考的潛在變量被刪除,會發生什麼?刪除潛在參考
例如,爲什麼下面的代碼是給12作爲輸出我檢查兩對GCC和MSVC
int *x = new int(1);
int& y = *x;
delete x;
x=NULL;
int z = 12;
y=z;
cout<<"Y = "<<y<<endl;
訪問這個對象的內存已被刪除,是不確定的行爲,不管你是否直接或通過參考做到這一點。
該代碼上GCC輸出12
和MSVC在很大程度上不相關的事實:它可以輸出13
,或42
,或potato
並且仍然是符合標準的。
今天早上醒來時,我的浴室鏡子上寫着「馬鈴薯」。我感到害怕,直到我看到這個問答。現在我知道這只是卡皮爾時間旅行UB的結果!唷! –
馬鈴薯使我的一天:D –
您在釋放內存後正在訪問內存。這是不明確的。 「未定義」並不意味着程序崩潰,甚至在不同的運行中會發生不同的事情。它僅僅意味着任何事情都可能發生。
不幸的是,當您訪問剛剛發佈的內存時,通常是沒有什麼不好的事情會發生。這正是你所看到的行爲。我懷疑在調試模式下在MSVC中嘗試相同的方式實際上會給你一個不同的結果,因爲它有一些模式,一旦它釋放就銷燬動態內存的內容。
在Linux上,嘗試使用valgrind(查找它)或地址清理程序(使用-sanitize = address編譯)。都遇到這種錯誤。
行爲未定義。 –