本文へスキップ
BecomeCoder

C++コース · 第10章 クラスの基礎 ― 自分だけの型を作る · レッスン41

デストラクタ ― 後片付けを自動化する

ブラウザで完結

導入

コンストラクタが「生成時」なら、デストラクタは「破棄時」に自動で呼ばれる特別な関数です。ファイルを閉じる・メモリを解放するといった「後片付け」を任せられます。これが C++ の強力な RAII(第16章)の土台です。

説明

デストラクタは ~クラス名() という名前で、インスタンスの寿命が尽きたとき(スコープを抜ける・delete される)に自動で呼ばれます。

flowchart LR
  a["生成"] -->|"コンストラクタ"| b["使用中"]
  b -->|"スコープを抜ける"| c["デストラクタ<br/>(後片付け)"]
#include <iostream>
#include <string>
using namespace std;

class File {
    string name;
public:
    File(string n) : name(n) {
        cout << name << " を開く" << endl;   // 生成時
    }
    ~File() {
        cout << name << " を閉じる" << endl;  // 破棄時(自動)
    }
};

int main() {
    {
        File f("data.txt");   // ここで「開く」
        cout << "処理中..." << endl;
    }   // ← ここでブロックを抜け、自動で「閉じる」
    cout << "ブロックの外" << endl;
    return 0;
}
// data.txt を開く / 処理中... / data.txt を閉じる / ブロックの外

「開いたら必ず閉じる」「確保したら必ず解放する」を人間が覚えておくのは大変ですが、デストラクタに書いておけば C++ が自動で呼んでくれます。閉じ忘れ・解放忘れを構造的に防げるのが利点です。

まとめ

デストラクタ ~クラス名() は破棄時に自動で呼ばれ、後片付けを担います。「取得した資源はデストラクタで返す」という考え方が RAII で、C++ の安全性の要になります(第16章で本格的に扱います)。

実際に動かしてみよう

下のエディタにC++を書いて「コンパイル & 実行」を押すと、ブラウザ内で本物のC++コンパイラ(clang + libc++)がその場でコンパイルして実行し、出力が表示されます。std::string・vector・クラス・テンプレート・STL などモダンC++がそのまま動きます。本文の例を書き換えて試しながら進めましょう(初回だけコンパイラの読み込みに時間がかかります。以降はキャッシュされます。この回は標準入力(cin)は使わず、値はコードに直接書きます)。

C/C++ — ブラウザ内で本物のコンパイラで実行

ブラウザ内で本物のC/C++コンパイラ(clang + libc++ / WebAssembly)を動かします。構造体・malloc/free・std::string・vector・クラス・テンプレート・STL などがそのまま実行できます(初回のみコンパイラの読み込みに時間がかかります。以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。