C++ Academy · レッスン

デストラクタとクリーンアップ

リソースを自動的に解放します

レッスン 2/413 ステップ

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

デストラクタの役割

デストラクタは、オブジェクトのライフタイムが終了したときに実行されます。オブジェクトが所有するものを解放するのが役割です。名前は ~ClassName です。

#include <iostream>

class File {
public:
    ~File() { std::cout << "closing file\n"; }
};

int main() {
    File f;
}   // ~File runs here

所有するメモリを解放する

クラスがヒープメモリを所有している場合、そのデストラクタで解放する必要があります。ここが delete を呼び出す典型的な場所です。

#include <iostream>

class Buffer {
    int* data;
public:
    Buffer(int n) : data(new int[n]) {}
    ~Buffer() { delete[] data; }   // cleanup
};

int main() { Buffer b(10); }

デストラクタは自動的に実行される

スタックオブジェクトのデストラクタを自分で呼び出してはいけません。コンパイラがスコープの終了時に呼び出しを挿入します。

メンバーは逆順に破棄される

メンバーオブジェクトは、デストラクタ本体の実行後、宣言された順序と逆の順序で破棄されます。

#include <iostream>

struct A { ~A() { std::cout << "~A\n"; } };
struct B { ~B() { std::cout << "~B\n"; } };
struct C {
    A a;
    B b;          // destroyed before a
    ~C() { std::cout << "~C\n"; }
};

int main() { C c; }

仮想デストラクタ

派生オブジェクトを基底ポインタ経由で削除する場合、基底クラスのデストラクタは virtual でなければなりません。そうしないと派生部分がリークします。

#include <iostream>

struct Base {
    virtual ~Base() { std::cout << "~Base\n"; }
};
struct Derived : Base {
    ~Derived() override { std::cout << "~Derived\n"; }
};

int main() {
    Base* p = new Derived();
    delete p;   // both run thanks to virtual
}

デストラクタは例外をスローしない

スタックの巻き戻し中にデストラクタから例外をスローすると、プログラムが終了します。デストラクタには(暗黙的に)noexcept を指定し、例外を外に漏らさないようにしてください。

デフォルトデストラクタ

デストラクタを何も記述しなければ、コンパイラが各メンバーを破棄するデストラクタを生成します。RAIIメンバーだけを持つクラスでは、これがまさに適切な動作です。

#include <string>
#include <vector>

struct Record {
    std::string name;          // self-cleaning
    std::vector<int> values;   // self-cleaning
};   // default destructor is enough

= default デストラクタ

~Class() = default; と記述すると、コンパイラが生成するデストラクタを明示的に要求できます。カスタム処理は不要ですが、仮想デストラクタが必要な場合に便利です。

#include <iostream>

struct Shape {
    virtual ~Shape() = default;   // virtual + default
};

メモリ以外のリソースを解放する

デストラクタはメモリを解放するだけでなく、ファイルを閉じ、ロックを解放し、ソケットも切断します。取得したリソースはすべてここで扱います。

オブジェクト間の破棄順序

複数のローカルオブジェクトは構築された順序と逆に破棄されるため、デストラクタは自分より前に作成されたオブジェクトを安全に使用できます。

RAIIメンバーに処理を任せる

すべてのメンバーがRAII型であれば、カスタムデストラクタは必要ないことがほとんどです。手書きのデストラクタは、生のリソースを扱う場合に限って用意してください。

理解度チェック

デストラクタについての理解度を確認しましょう。

まとめ

デストラクタはライフタイムの終了時に所有するリソースを自動的に解放し、メンバーを宣言順序の逆順に処理し、例外をスローしてはならないことを学びました。ポリモーフィックな基底クラスでは virtual にする必要があります。RAIIメンバーを使えば、カスタムデストラクタが不要になることもよくあります。

無料で開始

AI チューターと学ぶ C++ — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「デストラクタとクリーンアップ」レッスンは無料ですか?

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

「デストラクタとクリーンアップ」で何を学びますか?

リソースを自動的に解放します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「デストラクタとクリーンアップ」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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