Defensive Copies in Modern C++

現代 C++ 可使用不同方式解決這個問題:

std::string s1 = "Cpp";
std::string s2 = s1;  // Duplicate the data in s1.
  • s1 的堆積資料會重複,s2 會取得專屬的獨立副本。
  • s1s2 超出範圍時,皆會釋放自己的記憶體。

複製指派前:

StackHeaps1ptrCpplen3capacity3

複製指派後:

StackHeaps1ptrCpplen3capacity3s2ptrCpplen3capacity3

重要須知:

  • C++ 提供的選擇與 Rust 略有不同。由於 = 會複製資料,所以字串資料一定要完成複製。否則,假如其中任一字串超出範圍,就會導致重複釋放的結果。

  • C++ 也提供 std::move,用於指出何時可以轉移特定值。例如假設是 s2 = std::move(s1),就不會發生堆積分配的情形。轉移之後,s1 會處於有效但未指定的狀態。與 Rust 不同的是,程式設計師可以繼續使用 s1

  • C++ 中的 = 可以依照要複製或轉移的型別來執行任何程式碼,這點與 Rust 不同。