2017-07-15 74 views
-4

我已經知道當程序離開它的範圍時變量被銷燬。然而,這似乎並沒有發生,當我試圖在下面的代碼片斷代碼:返回一個局部變量的引用工作正常嗎?

int& somethin() 
    { 
     int x1 = 4; 

     return x1; 
    } 
    int main() {  
     int x11; 
     x11 = somethin(); 
     cout << x11 << endl; 

     return 0; 
    } 

出人意料的是,輸出結果是:4

而當我宣佈「X11」作爲參考變量,我得到垃圾值。

任何解釋?

注:我重複這個試驗了很多次。我不認爲這是關於運氣。 注意:在StackOverflow中有一個人問過同樣的問題,答案是關於測試員是幸運的。

+0

想想執行堆棧在一臺機器如何運作 - 大多數C++運行時環境不零出一個彈出堆棧幀,這就是爲什麼基準的目標值'4'仍然存在 - 但這並不意味着你應該依賴那種行爲。 – Dai

+0

[我得到0](http://cpp.sh/243to) – yrHeTaTeJlb

+5

這是未定義的行爲。這意味着任何具體的行爲都不會發生。這就是爲什麼它很危險。 – StoryTeller

回答

3

任何解釋?

行爲是未定義的。

標準並不保證未定義行爲會對您所期望的行爲。它也不能保證行爲總是一樣的。在我的電腦上,結果是段錯誤。

對於它的價值,你能想象的實現:x1某處存儲在內存中,所以值4是在內存中的某個地方。函數調用後,該內存不再用於x1,所以它可以用於別的東西。 x11存儲在內存中的某處。如果恰好使用了相同的內存位置,那麼該內存位置的垃圾值可能恰好爲4.

雖然當我聲明「x11」作爲引用變量時,我會得到垃圾值。

4也是一個垃圾值。

1

局部變量存儲在自動存儲器中。當它們超出範圍時,它們被銷燬。

返回到一個本地變量的參考違反語言的規則,並因此是undefined behaviour(就像作爲解引用nullptr)。

話雖這麼說,沒有關於x11的價值保證。它可以產生正確的結果,但這不是一種語言功能。

你可以找到更多關於undefined behaviour這裏: What are all the common undefined behaviours that a C++ programmer should know about?