2011-01-15 72 views
3

請參閱以下代碼片段。在第二個函數中,我返回一個引用。我在函數中聲明一個局部變量並返回地址。由於變量是局部的,我相信當它退出函數時,它的生命就結束了。我的問題是爲什麼即使原始變量被刪除,也可以在沒有任何異常的情況下從調用者訪問值?返回參考

int& b=funcMulRef(20,3); 

int* a= funcMul(20,3); 


int* funcMul(int x,int y) 
{ 
int* MulRes = new int; 
     *MulRes = (x*y); 

return MulRes; 

} 

int& funcMulRef(int x,int y) 
{ 
int MulRes ; 
     MulRes = (x*y); 

return MulRes; 

} 

問候, 約翰

+0

on funcMul,我想你的意思是* * MulRes =(x * y)' – Muggen

+0

@Muggen。感謝您指出。現在更正。 –

回答

7

所述第二函數的行爲僅僅是未定義;任何事情都可能發生,並且在很多情況下,它看起來會起作用,因爲沒有任何東西會覆蓋結果用於存儲在堆棧上的地方。

+0

爲什麼第一個函數不能編譯?另外,+1 – Muggen

+1

@Muggen:您無法將整數指定給指針。 –

+0

啊好的。我還以爲還有其他的東西。 ty – Muggen

2

您正在訪問不在範圍內的數據。

雖然內存可能仍然有數據,但它似乎可以正常工作,但很可能會隨時重複使用,並且該值將被覆蓋。

下一次調用任何函數或分配本地堆棧變量時,很可能會重新使用該內存來存儲新數據並覆蓋之前的內容。這是行爲不清的行爲。

2

原始值不會被刪除。只是因爲刪除它的行爲會導致一些看不見的計算。

該值仍然存在,但內存空間不再是你的,實際上是未定義的。

您正指向可以被程序溢出的內存空間。

0

它很可能不會在這些情況下工作:

funcMulRef(10,3) + funcMulRef(100,500) 

或者,更討厭的方式:

std::cout << "10*3=" << funcMulRef(10,3) << " 100*500=" << funcMulRef(100,500) << std::endl; 

gcc會警告這種錯誤,如果你使用-Wall