所有権(Ownership)
所有権(Ownership)
Rustの最大の特徴は「所有権」システムだ。 CやC++のような低レベル言語では、メモリ管理のミス(ダングリングポインタ、二重解放、メモリリークなど)がバグやセキュリティホールの温床になる。 Rustはこの問題を根本から解決するため、すべての値に「所有者」を必ず1つだけ割り当てるルールを導入した。
所有権の基本ルール
- すべての値は必ず1つの所有者(owner)を持つ。
- 所有者がスコープから抜けると、その値は自動的に破棄(drop)される。
- 所有権は変数間で「ムーブ」できる。ムーブ後、元の変数は無効になる。
このルールにより、誰がどの値を管理しているかが常に明確になる。
例:所有権のムーブ
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の安全性・効率性の根幹だ。メモリ管理の責任を明確にし、バグやセキュリティリスクを大幅に減らせる。