C++ return moved dangling reference

回傳 local varaible(as lvalue), tempoaraty variable(as rvalue), moved varaible(as xvalue)時,只要你是 return by lvalue reference(&),或是 return by rvalue reference(&&),就會把 dangling referernce 洩漏出去。因為這三種被referencedvaraible,會在 function 離開 block 時,就會死亡。

而 return by value 則會安全的在變數死前,將該 copy 的,該 moved 的,改 initialize 的,由 compiler 偷偷幫你做好。

不要手動 move,這會壓抑 compiler 幫你做 RVO/NRVO 的 copy 省略動作。

因為每次寫下下面這種 code,自以為的會省下一點 copy。後來看到 SO 的一個回答 。說是不要手動 move,這是最爛的加速手法,因為會阻止 Compiler 做更有效的 RVO/NRVO。

std::vector<int>&& get_vector(){
  std::vector<int> src = { 1, 2, 3, 4 };
  return std::moved(src);
};

std::vector<int> a = get_vector(); // <-- crash here
a[0];                              // <-- not here

但是除此之外,每次跑這個 Code 一定會當。我知道 return 一個 lvalue reference 出去,會有 dangling reference 的問題。但是可能是看到 rvalue-reference,以為他會在死之前就把 internal memory 給 stolen 出去,所以一直想不透,怎麼會當呢XDD

最後因為後來留言裡的有一句 rvalue reference is also a reference,一語點醒夢中人。

各種 return 方式 Test

PS. MSVC 盡然可以 bind 自定class 的 rvalue referencenon-const lvalue-reference 是他的一個 extension...

comments powered by Disqus