Defensive Copies in Modern C++
現代 C++ 可使用不同方式解決這個問題:
std::string s1 = "Cpp";
std::string s2 = s1; // Duplicate the data in s1.
s1
的堆積資料會重複,s2
會取得專屬的獨立副本。- 當
s1
和s2
超出範圍時,皆會釋放自己的記憶體。
複製指派前:
複製指派後:
重要須知:
-
C++ 提供的選擇與 Rust 略有不同。由於
=
會複製資料,所以字串資料一定要完成複製。否則,假如其中任一字串超出範圍,就會導致重複釋放的結果。 -
C++ 也提供
std::move
,用於指出何時可以轉移特定值。例如假設是s2 = std::move(s1)
,就不會發生堆積分配的情形。轉移之後,s1
會處於有效但未指定的狀態。與 Rust 不同的是,程式設計師可以繼續使用s1
。 -
C++ 中的
=
可以依照要複製或轉移的型別來執行任何程式碼,這點與 Rust 不同。