【Rust】第3章第1回:Rustの所有権システム:基本概念とルール

本記事では、Rustの最も重要な概念である「所有権」について解説します。Rustのメモリ管理の仕組みを理解し、安全かつ効率的なプログラムを書けるようになりましょう。
0. 記事の概要
この記事を読むメリット
- Rustの所有権システムの基本を理解: メモリ管理の仕組みが分かります。
- エラーを防ぐ: 借用とライフタイムの概念を理解し、プログラムの安全性を高めます。
- コードの最適化: 効率的なメモリ管理によるパフォーマンス向上が可能になります。
この記事で学べること
- Rustの所有権の基本ルール
- 変数の所有権の移動(ムーブ)
- 所有権とメモリ管理の関係
1. 所有権とは?

1.1 所有権の基本概念
Rustでは、メモリ管理を「所有権」という仕組みで行います。各変数は所有者を持ち、所有者がスコープを抜けるとメモリが解放されます。
fn main() {
let s = String::from("Hello, Rust!"); // sが所有者
println!("{}", s);
} // sがスコープを抜けると、メモリが解放される
動作解説
このコードでは、変数s
がString
の所有者となり、スコープ終了時にメモリが解放されます。
2. 所有権の移動(ムーブ)

2.1 変数のムーブ
Rustでは、所有権を別の変数に渡すと、元の変数は無効になります。
fn main() {
let s1 = String::from("Rust");
let s2 = s1;
println!("{}", s2); // s1は無効になり使用不可
}
動作解説
変数s1
の所有権がs2
に移動したため、s1
は無効になり使用できません。
3. 所有権と関数

3.1 関数への所有権の移動
関数に値を渡すと、所有権も移動します。
fn take_ownership(s: String) {
println!("{}", s);
} // ここでsがスコープを抜け、メモリが解放される
fn main() {
let s = String::from("Hello");
take_ownership(s);
// println!("{}", s); // ここでエラーになる
}
動作解説
s
の所有権が関数take_ownership
に移動したため、関数の外ではs
を使用できません。
4. よくあるエラーと対処法
- 「value borrowed here after move」エラー: ムーブ後に元の変数を使用しようとすると発生。所有権の移動を確認する。
- 「value does not live long enough」エラー: スコープを抜けた変数を使用しようとすると発生。適切なスコープ管理が必要。
5. まとめ
本記事では、Rustの所有権の基本ルール、ムーブ、関数との関係について解説しました。次回は、借用(Borrowing)と参照について詳しく学びます。