// 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 |
関数を抜けると同時に破棄される |
補足
この辞書が使われているページ
backlinks 2