Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
所有権 / 移動(move)
Rustの所有権(ownership)は、各値に必ず1つの所有者があるという独自のルールで、メモリ安全性をコンパイル時に保証します。所有者がスコープを抜けると、値は自動的に解放されます。
構文
// 所有権の移動(move)
let 変数1 = 値;
let 変数2 = 変数1; // 変数1の所有権が変数2に移動します(変数1は無効)。
// 関数への所有権移動
fn 関数名(引数: 型) { ... }
関数名(変数); // 変数の所有権が関数に移動します。
// 明示的なメモリ解放
drop(変数);
概要一覧
| ルール | 概要 |
|---|---|
| 所有者は1つ | 各値に対して所有者となる変数は常に1つだけです。 |
| スコープで解放 | 所有者がスコープを抜けると、値のメモリが自動的に解放されます。 |
| moveセマンティクス | 代入・関数渡しで所有権が移動し、元の変数は使用不可になります。 |
| drop() | 所有権を持つ変数を即座に解放したい場合に使用します。 |
サンプルコード
fn take_ownership(s: String) {
println!("{}", s);
} // ここでsが解放されます。
fn main() {
let s1 = String::from("hello");
let s2 = s1; // s1の所有権がs2に移動します。
// println!("{}", s1); // エラー:s1はもう使えません。
println!("{}", s2); // 『hello』と出力されます。
let s3 = String::from("world");
take_ownership(s3); // s3の所有権が関数に移動します。
// println!("{}", s3); // エラー:s3はもう使えません。
// drop()で即座に解放します。
let s4 = String::from("drop me");
drop(s4);
// println!("{}", s4); // エラー:s4は解放済みです。
// Copyトレイトを持つ型はmoveではなくコピーされます。
let x = 5;
let y = x; // xはまだ使えます。
println!("x={}, y={}", x, y); // 両方使えます。
}
概要
Rustの所有権システムはガベージコレクタなしにメモリ安全性を保証します。値がスコープを抜けると自動的に『drop()』が呼ばれ、メモリが解放されます(RAIIパターン)。
所有権が移動した変数を使用しようとすると、コンパイルエラーになります。値を複数の場所で使いたい場合は、借用(&参照)またはclone()を使用してください。
整数・浮動小数点・bool・char などCopyトレイトを実装した型は、代入時にコピーが行われるため元の変数も引き続き使用できます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。