2012-07-06 120 views
2

任何人都可以向我解釋爲什麼這段代碼有效(爲什麼它返回一個值)?引用返回奇怪值的指針

int main() 
{ 
    int *ptr = new int(113); 
    int &rPtr = *ptr; 

    delete ptr; 

    cout << rPtr << endl; 

    return 0; 
} 

基本上,這是返回值,我得到:

-572662307 
+4

你期望它做什麼? – RedX 2012-07-06 21:43:29

+0

究竟是什麼讓你問這個問題?當人們提出這樣的問題時,這意味着他們看到了與他們期望看到的不同的東西。在這種情況下你期望看到什麼? – AnT 2012-07-06 21:51:42

+0

我沒有看到任何東西。我剛剛得到了這個想法,如果我嘗試這樣的事情會發生什麼,所以我試了一下,得到了奇怪的結果,所以我決定問:D – deadmau5 2012-07-06 22:00:09

回答

3

你在做什麼會導致未定義的行爲,所以你得到這個數字的事實是完全合理的行爲。

一旦執行此序列:

int *ptr = new int(113); 
int &rPtr = *ptr; 

參考rPtr現指你與線new int(113)創建的整數。在下一行,你執行

delete ptr; 

這將刪除int,這意味着對象不再存在。現在任何指針或對它的引用都會引用一個釋放對象,這會導致未定義的行爲。因此,當您打印rPtr

cout << rPtr << endl; 

任何事情都可能發生。在這裏,你只是得到垃圾數據,但程序很容易崩潰或報告調試錯誤消息。有趣的是:您打印的值(-572662307),視爲32位無符號值,爲0xDDDDDDDD。我敢打賭,這是內存分配器將一個值放入釋放內存以幫助您調試像這樣的內存錯誤。

希望這會有所幫助!

+0

非常感謝您的回覆:) – deadmau5 2012-07-09 00:24:00

0

你調用未定義行爲。基準是刪除指針後不再有效:

int *ptr = new int(113); 
int &rPtr = *ptr; 
//rPtr references the memory ptr points to 
delete ptr; 
//the memory is released 
//the reference is no longer valid 
cout << rPtr << endl; 
//you try to access an invalid reference 
//anything can happen at this point 
0

參考的對象爲所有的塊範圍活着(在這種情況下,功能範圍內),所以當你刪除指針,一些垃圾在這個地址和輸出顯示它。