關於返回區域性變數的指標或引用
阿新 • • 發佈:2019-02-16
C++ primer中說“不要返回區域性變數中的引用和指標”
但是今天一個簡單的程式跑出來結果正確,很詫異……
int *fun1() { int i = 100; int *j = &i; return j; } int &fun2() { int i = 100; return i; } int main() { int *p = fun1(); cout << *p << endl; //編譯通過,輸出結果為100 int &m = fun2(); cout << m<< endl; //編譯通過,輸出結果為100 }
網上查了下原因,是因為區域性變數確實儲存在堆疊中,但是函式呼叫完成資料並沒有立即被清空,釋放變數記憶體的意思是該記憶體可以被其他物件使用。也就是說,在沒有其他資料對該記憶體進行覆蓋前,記憶體中的原資料可用。
int *fun1() { int i = 100; int *j = &i; return j; } int &fun2() { int i = 100; return i; } int main() { int *p = fun1(); cout << *p << endl; //編譯通過,輸出結果為100 cout << *p << endl; //再次輸出,輸出結果不定 int &m = fun2(); cout << m<< endl; //編譯通過,輸出結果為100 cout << m<< endl; //再次輸出,輸出結果不定 }