Rust/所有権
複数の不変参照またはひとつの可変参照しか許容しないRustにおける所有権の仕組み.
https://doc.rust-jp.rs/book-ja/ch04-01-what-is-ownership.html
これによってある参照が存在する場合に,その他に可変参照が存在しないことが保証される.
これによりデータ競合の発生を回避できる
ヒープをうまく管理したいという目的がある
メモリ解放をちょうど1回だけするという要請を達成したい
ダングリングポインタの発生を抑制できる
code:.rs
// こういうのがエラーで検知される
fn dangle() -> &String { // dangleはStringへの参照を返す
let s = String::from("hello"); // sは新しいString
&s // String sへの参照を返す
} // ここで、sはスコープを抜け、ドロップされる。そのメモリは消される。
// 危険だ
各値は所有者と呼ばれる変数と対応している
いかなる時も所有者は1つである
所有者がスコープから外れたら値は破棄される
このとき値に対してdrop()が呼ばれる
別の変数でヒープ上の値を指すポインタを確保した場合,それ以前のポインタは無効なものになる.
これをムーブと呼ぶ.
関数の引数に対してもムーブは発生するが,これは参照渡しによって回避できる.
この用法を借用と呼ぶ.
借用したものはImmutableになる
スコープを明示的に作成することで複数の可変参照を作成することができる
code:.rs
let mut s = String::from("hello");
{
let r1 = &mut s;
} // r1はここでスコープを抜けるので、問題なく新しい参照を作ることができる
let r2 = &mut s;