动态

详情 返回 返回

為什麼返回一個臨時對象的引用是不安全的 - 动态 详情

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複製進去,此時,會產生和上面那段代碼一樣的問題。
如果此時,調用這個函數,其實也是未定義行為。

Add a new 评论

Some HTML is okay.