所有権(Ownership)

author: chatGPT


所有権(Ownership)

Rustの最大の特徴は「所有権」システムだ。 CやC++のような低レベル言語では、メモリ管理のミス(ダングリングポインタ、二重解放、メモリリークなど)がバグやセキュリティホールの温床になる。 Rustはこの問題を根本から解決するため、すべての値に「所有者」を必ず1つだけ割り当てるルールを導入した。

所有権の基本ルール

  1. すべての値は必ず1つの所有者(owner)を持つ。
  2. 所有者がスコープから抜けると、その値は自動的に破棄(drop)される。
  3. 所有権は変数間で「ムーブ」できる。ムーブ後、元の変数は無効になる。

このルールにより、誰がどの値を管理しているかが常に明確になる。

例:所有権のムーブ

fn main() {
    let s1 = String::from("hello");
    let s2 = s1; // s1の所有権がs2にムーブされる
    // println!("{}", s1); // エラー: s1はもう使えない
    println!("{}", s2); // OK
}

この例では、s1の所有権がs2に移ったのでs1は無効になる。

所有権と関数

関数に値を渡すと、所有権も一緒にムーブされる。

fn takes_ownership(s: String) {
    println!("{}", s);
}

fn main() {
    let s = String::from("hello");
    takes_ownership(s); // sの所有権が関数にムーブされる
    // println!("{}", s); // エラー: sはもう使えない
}

コピー型(Copyトレイト)

整数型やboolなど一部の型は「ムーブ」ではなく「コピー」になる。

fn main() {
    let x = 5;
    let y = x; // xもyも使える(i32はCopy)
    println!("{} {}", x, y);
}

注意点

  • 所有権のルールは最初は厳しく感じるが、慣れるとバグの温床を根絶できる。
  • 参照や借用(Borrowing)を使うことで、所有権を移さずに値を扱える(詳細はborrowing.md参照)。

まとめ

所有権システムはRustの安全性・効率性の根幹だ。メモリ管理の責任を明確にし、バグやセキュリティリスクを大幅に減らせる。