0Pricing
C++ Academy · レッスン

RAII原則

リソースをオブジェクトのライフタイムに結び付けます

「RAII原則」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

RAII とは

RAII は、リソースの取得は初期化を意味します。コンストラクタでリソースを取得し、デストラクタで解放することで、そのライフタイムをオブジェクトに結び付けます。

基本的な考え方

メモリ、ファイル、ロック、ソケットなど、すべてのリソースをオブジェクトでラップします。オブジェクトがスコープを抜けると、デストラクタがリソースを自動的に解放します。

#include <iostream>

class Resource {
public:
    Resource() { std::cout << "acquire\n"; }
    ~Resource() { std::cout << "release\n"; }
};

int main() {
    Resource r;   // acquired
}                 // released automatically

RAII が強力な理由

関数が早期に return した場合や例外がスローされた場合でも、後片付けが保証されます。ラップしたリソースの解放を忘れることはありません。

小さなRAIIラッパー

ここでは、デストラクタでヒープメモリを解放する int の所有クラスを示します。呼び出し側で手動の delete は必要ありません。

#include <iostream>

class IntBox {
    int* p;
public:
    IntBox(int v) : p(new int(v)) {}
    ~IntBox() { delete p; }
    int get() const { return *p; }
};

int main() {
    IntBox b(42);
    std::cout << b.get() << "\n";
}

早期 return 時の後片付け

デストラクタはスコープの終了時に実行されるため、早期の return でも後片付けが行われます。

#include <iostream>

class Guard {
public:
    ~Guard() { std::cout << "cleaned\n"; }
};

void work(bool stop) {
    Guard g;
    if (stop) return;   // g still cleaned
    std::cout << "more work\n";
}

int main() { work(true); }

例外発生時の後片付け

例外によってスタックが巻き戻されると、完全に構築済みのすべてのRAIIオブジェクトがその過程で破棄されます。リソースが取り残されることはありません。

標準的なRAII型

標準ライブラリにはRAIIが広く使われています。std::unique_ptr、std::lock_guard、std::fstream、std::vector はすべてデストラクタで後片付けを行います。

#include <vector>
#include <memory>

int main() {
    std::vector<int> v{1, 2, 3};        // frees its buffer
    auto p = std::make_unique<int>(9);  // frees its int
}

手動の後片付けコードは不要

RAIIを使えば、delete、fclose、unlock を手作業で記述する必要がなくなります。コンパイラが挿入するデストラクタ呼び出しが代わりに処理してくれます。

1つのリソースに1つの所有者

各リソースには、それを解放する責任を持つRAII所有者を1つだけ設定してください。所有権を安全に共有するには、std::shared_ptr のような専用の型が必要です。

RAII は組み合わせられる

RAIIオブジェクトは、ほかのRAIIオブジェクトを含むことができます。破棄が自動的に連鎖するため、複雑なリソースも正しく後片付けされます。

#include <memory>
#include <vector>

struct Session {
    std::vector<int> data;                 // RAII
    std::unique_ptr<int> token;            // RAII
};   // both members freed automatically

RAII と手動管理の比較

手動管理はエラーが起こりやすい一方、RAIIでは正しい後片付けがデフォルトになります。どのような場合でも、生の取得・解放の組み合わせよりRAIIラッパーを優先してください。

理解度チェック

RAIIについての理解度を確認しましょう。

まとめ

RAIIの原則、つまりコンストラクタで取得し、デストラクタで解放することを学びました。これにより、通常の終了、早期 return、例外発生時のすべてで後片付けが保証されます。標準ライブラリではRAIIがいたるところで使われており、あなたのコードでも使うべきです。

よくある質問

「RAII原則」レッスンは無料ですか?

はい。「RAII原則」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「RAII原則」で何を学びますか?

リソースをオブジェクトのライフタイムに結び付けます ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「RAII原則」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. RAII原則
  2. デストラクタとクリーンアップ
  3. Rule of Three/Five
  4. スコープガード
← C++ Academyに戻る