C++返回局部引用異常過程分析

std::vector<int>&& Ref()
{
 std::vector<int> iv;
 iv.push_back(1);
 iv.push_back(1);
 iv.push_back(1);
 iv.push_back(1);
 return std::move(iv);
}

std::vector<int> iq = Ref();

運行coredump。

std::vector<int> iq = Ref();我們知道函數返回對象的時候,是通過一個臨時對象來傳遞的。

這裏的返回值是右值引用,因此臨時對象也是右值引用。右值引用首先也是引用。

這句話可以分解爲:

std::vector<int>&& temp = std::move(iv);//右值引用內部局部變量,

函數結果,temp失效

std::vector<int> iq = temp;//ub 

 

又例如:

void Test::Reff()
{
    std::vector<int> iv;
    iv.push_back(1);
    iv.push_back(1);
    iv.push_back(1);
    iv.push_back(1);
    result = std::move(iv);
}

這樣寫,這裏result = std::move(iv);雖然iv是局部變量,但是iv在被result引用的時候,

生命週期還沒有結束,result完成了移動構造,

然後函數結束,iv銷燬,這樣是沒問題的。因爲最終的 result = 已經移動拷貝了iv的右值引用類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章