Rust

【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がスコープを抜けると、メモリが解放される

動作解説

このコードでは、変数sStringの所有者となり、スコープ終了時にメモリが解放されます。

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)と参照について詳しく学びます。