1.問題説明
返回一個臨時對象的引用是不安全的,因為當離開作用域,這個臨時對象會馬上析構,所以函數返回的總是懸掛引用(空懸引用),使用這個引用是一個未定義行為,會導致程序崩潰。
2.問題分析
看下面這段代碼:
const int&retRef()
{
return 1180;
}
const int&k = retRef();
std::cout<<k<<std::endl;
此時打印k,就是一個未定義行為,因為,1180的引用所指對象已經被銷燬了(引用其實只是常量指針)。
這個很容易識別。但是,這裏實際上隱含一個只能指針的坑。
下面這段代碼其實也是不安全的:
const std::shared_ptr<int>& retRef()
{
return nullptr;
}
智能指針也是一個對象,返回nullptr,編譯器會構造一個臨時對象,並用拷貝構造函數吧null複製進去,此時,會產生和上面那段代碼一樣的問題。
如果此時,調用這個函數,其實也是未定義行為。