首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 返回右值引用的陷阱:避免懸空引用導致空向量

     編輯:程式設計綜合問答

錯誤代碼

std::vector&& getvec() {
    std::vector a;
    a.push_back(1);
    return std::move(a); // 返回局部變量的右值引用
}

int main() {
    std::vector a = getvec(); // a 為空!
}

問題分析

函數返回 std::vector&&,綁定的是局部變量 a。函數結束時 a 被銷毀,返回的引用變成懸空引用。雖然 std::move 將 a 轉為右值,但無法延長其生命週期。

正確做法

方法一:值返回(推薦,利用 RVO/NRVO)

std::vector getvec() {
    std::vector a;
    a.push_back(1);
    return a; // 編譯器優化消除拷貝
}

方法二:調用端用右值引用接收(延長生命週期)

std::vector&& getvec(); // 聲明不變

int main() {
    std::vector&& a = getvec(); // 綁定到臨時對象,生命週期延長至 a 作用域結束
    // 使用 a...
}

核心規則

  • 永不返回局部變量的引用(左值或右值)。
  • 優先返回值,現代編譯器會優化移動語義。
  • 若必須返回引用,確保引用指向靜態、全局或調用者傳入的對象。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved