2011-09-21 144 views
1

可能重複:
Can a local variable's memory be accessed outside its scope?內存管理問題

我有以下從那裏我讀這篇文章涉及到內存管理,源問題說, 當一個變量超出超出範圍,該內存不再保證存儲 變量的值 示例代碼給出

int main() { 
    int *p; 
    if (true) { 
    int x = 5; 
    p = &x; 
    } 
cout << *p << endl; // ??? 
} 

它說也是 這裏,對已經成爲懸擺指針(指向的內存,其內容是不確定的) 但是這個代碼顯示了我結果5.so是錯寫這樣的代碼嗎?請解釋我

+2

看看這個** [基本上相同的問題] **(http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope)**爲了好的閱讀。 – Anson

+0

檢出[this](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope/「here」)post。 – Michael

回答

7

關鍵短語「不再保證」。行爲是undefined。它可能工作,也可能不工作,這取決於你的編譯器決定做什麼。

你不能依賴這種行爲。所以你不應該寫這樣的代碼。

+2

谷歌爲鼻惡魔。 – PlasmaHH

1

你的代碼給你留下一個變量的地址不再存在。 C++標準不會聲稱該內存會發生什麼情況。解引用指針將產生未定義的行爲

不幸的是,UB的一種表現方式是通過代碼看起來有效。

2

我認爲這是因爲......地址由p仍然具有地址x的值在本地範圍內,但編譯器現在可以自由分配該空間。所以行爲完全沒有定義。該塊後

2

if (true) { 
    int x = 5; 
    p = &x; 
} 

可變x從棧展開,所以存儲器它被佔用是免費再利用。它可以隨時重用。

4

刪除一個對象時,用於存儲該對象的內存範圍被解除分配。這隻意味着其他進程現在可以自由使用這個內存範圍。存儲在那裏的值將保持不變,直到由另一個進程寫入。

這與在'刪除'窗口中的內容時非常相似。你實際上在做什麼是告訴系統你允許它使用這個空間來做其他事情。如果您立即嘗試恢復文件,那麼您的硬盤上還沒有其他文件可以寫入。如果您等了幾天,那麼很可能會有另一個文件被寫入其中。

懸掛指針因此不能保證返回您最初存儲在那裏的值。

0

}x變量內存得到免費,你使用該內存出}