2012-04-28 116 views

回答

1

a在函數的作用域結束時被釋放。

那麼這個輸出的原因是什麼?
通過超出變量存在範圍的內存位置的指針訪問自動變量的內容是根據標準的未定義行爲。

您的程序確實如此,所以它有一個未定義的行爲(UB)。藉助UB,您的程序可以顯示任何有效或無效的行爲參考文獻1

註釋1C++ 03部分1.3.24:

允許不確定的行爲從範圍與不可預測的結果完全無視的情況下,以在形成文件的翻譯或程序執行期間表現(有或者沒有發佈診斷消息)的環境特徵,終止翻譯或執行(通過發佈診斷消息)。

+0

未定義的行爲!這是什麼意思 ? – faressoft 2012-04-28 15:05:54

+0

@faressoft:[未定義的行爲](http://en.wikipedia.org/wiki/Undefined_behavior) – 2012-04-28 15:15:14

+0

你的意思是在函數結束後內存中沒有10的值嗎? – faressoft 2012-04-28 15:39:22

1

是的,當函數退出時,分配給a的存儲被取消分配。

2

從技術上講,a存儲在內存中的內存可供我們在其他情況下使用,因此回答您的問題,是的。

雖然這取決於一些因素。有可能甚至沒有記憶可言。在您的特定示例中,優化器可能會將所有內容都截斷。即使您執行類似cout << a的操作,也可以內聯一個5,該內存不駐留在內存中。

請注意,如果您通過引用傳遞,則生命週期是原始變量的壽命週期。

此外,僅僅因爲它被釋放,並不意味着內存將在以後自動清理。該值可能仍然駐留在那裏,直到該內存被重用。

你的榜樣 exibits未定義行爲:

void fun3(int *&p, int a){ 
     p = &a; 
} 

a是一個局部變量,你把它的地址,並將其分配給p,然後您可以在函數外使用。任何事情都可能發生。