Progrust Library.

// dictionary

ダングリング参照.

ダングリング参照(dangling reference)とは、参照先の値の所有権が別の値へ移動するまたは破棄されるなどして無効になった状態の参照のことです。C/C++などでは実行時のバグとして現れますが、Rustでは借用の規則の1つとして「参照は常に有効な値を指していなければならない」と定められており、安全な(unsafeを使わない)Rustではダングリング参照が発生するコードはコンパイル時にエラーとして弾かれます。

fn dangling<'a>() -> &'a String {
    let s = String::from("こんにちは");
    &s // エラー: E0515(ローカル変数 s への参照を返そうとしている)
} // ここで s はスコープを抜けて破棄される

fn main() {
    let r = dangling();
    println!("{r}");
}
Playgroundで開く

なぜ検出できるのか

上記の例では、関数danglingが返す参照は自身の内部で作られたローカルな変数sを指していますが、sは関数を抜ける際にスコープを抜けて破棄されます。つまり呼び出し元が受け取る参照は、すでに存在しない値を指すダングリング参照になってしまいます。

コンパイラはこれを、参照にライフタイム(参照が有効でいられる期間)を割り当てて検査することで検出します。上記の例では、両者のライフタイムの長さが噛み合わず、コンパイルエラーになります。

ライフタイム
返り値の参照'a 呼び出し元まで生き続ける必要がある
参照先のs 関数を抜けると同時に破棄される

補足

ダングリング参照を避けるには

この問題を安全に解決するには、値そのものの所有権を返す(&StringではなくStringを返す)か、クローンして独立した値を返すなど、関数を抜けた後も値自体が生き続けるようにする方法があります。

この辞書が使われているページ

backlinks 2

  1. 辞書借用
  2. 動かして学ぶRustプログラミング問題集 › 第8章 参照と借用