【C++】デストラクタとは?オブジェクトが消滅する時の自動後片付け処理

目次

はじめに

C++のコンストラクタが、オブジェクトが「生まれる」瞬間に自動で呼ばれる初期化処理であるのに対し、「デストラクタ (Destructor)」は、オブジェクトがメモリ上から「消滅する」直前に自動で呼び出される、後片付けのための特別なメンバ関数です。

デストラクタの主な役割は、オブジェクトが使用していたメモリやファイルハンドルなどのリソースを、プログラムに安全に返却することです。これにより、メモリリークなどの問題を未然に防ぐことができます。

この記事では、デストラクタの基本的な定義方法と、どのようなタイミングで呼び出されるのかを、分かりやすく解説します。


デストラクタの定義ルール

デストラクタには、コンストラクタと同様に、厳密なルールがあります。

  1. 関数名は、クラス名の前にチルダ (~) を付けたものでなければならない。
  2. 戻り値の型(voidも含む)を記述してはならない
  3. 引数を持つことはできない
  4. 一つのクラスに複数定義(オーバーロード)することはできない。

デストラクタを使ったサンプルコード

このコードは、MyObjectクラスにコンストラクタとデストラクタを定義し、オブジェクトが生成されるタイミングと、スコープを抜けて破棄されるタイミングを追跡します。

完成コード

#include <iostream>
#include <string>

using namespace std;

class MyObject {
public:
    string name;

    // コンストラクタ
    MyObject(string n) {
        name = n;
        cout << "コンストラクタ: オブジェクト「" << name << "」が生成されました。" << endl;
    }
    
    // デストラクタ
    ~MyObject() {
        cout << "デストラクタ: オブジェクト「" << name << "」が破棄されます。" << endl;
    }
};

// testFunctionのスコープ
void testFunction() {
    cout << "--- testFunctionを開始 ---" << endl;
    MyObject obj_in_func("関数内のオブジェクト");
    cout << "--- testFunctionを終了 ---" << endl;
    // ここで obj_in_func のスコープが切れるため、デストラクタが呼ばれる
}

// main関数のスコープ
int main() {
    cout << "--- main関数を開始 ---" << endl;
    
    testFunction(); // 関数を呼び出す
    
    MyObject obj_in_main("main内のオブジェクト");
    cout << "--- main関数を終了 ---" << endl;
    
    return 0;
    // ここで obj_in_main のスコープが切れるため、デストラクタが呼ばれる
}

実行結果

--- main関数を開始 ---
--- testFunctionを開始 ---
コンストラクタ: オブジェクト「関数内のオブジェクト」が生成されました。
--- testFunctionを終了 ---
デストラクタ: オブジェクト「関数内のオブジェクト」が破棄されます。
コンストラクタ: オブジェクト「main内のオブジェクト」が生成されました。
--- main関数を終了 ---
デストラクタ: オブジェクト「main内のオブジェクト」が破棄されます。

コードの解説

~MyObject()

これがデストラクタの定義です。クラス名 MyObject の前にチルダ ~ が付いています。引数も戻り値もありません。

デストラクタが呼び出されるタイミング

デストラクタは、オブジェクトの「スコープ」が終了するタイミングで自動的に呼び出されます。スコープとは、その変数が有効な範囲のことです。

  • obj_in_func: testFunction{} の中で宣言されているため、testFunction が終了する } の時点でスコープを抜け、デストラクタが呼び出されます。
  • obj_in_main: main関数の中で宣言されているため、main関数が終了する } の時点でスコープを抜け、デストラクタが呼び出されます。

実行結果の出力順を見ると、オブジェクトが生成されたときにはコンストラクタが、そのオブジェクトが有効範囲を抜けるときにはデストラクタが、それぞれ対応して呼び出されていることが明確に分かります。

newdelete

new 演算子を使って動的にメモリを確保したオブジェクトの場合は、スコープが切れても自動では破棄されません。delete 演算子を明示的に呼び出したタイミングで、デストラクタが実行されます。


まとめ

今回は、C++のデストラクタの基本的な役割と使い方について解説しました。

  • デストラクタは、オブジェクトが破棄される直前に自動で呼び出される後片付け用の関数。
  • 関数名は ~クラス名 で、引数も戻り値もない。
  • 主な目的は、オブジェクトが使用したメモリなどのリソースを解放すること。

単純なクラスではデストラクタを明示的に書く必要はあまりありませんが、new で確保したメモリを解放するなど、後片付けが必要なクラスを設計する際には、デストラクタの役割が非常に重要になります。

副業から独立まで「稼げる」Webスキルを習得する(PR)

ここまで読んでいただきありがとうございます。 最後に宣伝をさせてください。

「副業を始めたいが、何から手をつければいいかわからない」「独学でスキルはついたが、収益化できていない」という悩みを持つ方には、マンツーマン指導のWebスクール**「メイカラ」**が適しています。

このスクールは、単に技術を教えるだけでなく、**「副業として具体的にどう稼ぐか」**という実務直結のノウハウ提供に特化している点が特徴です。

講師陣は、実際に「副業Webライターから1年で独立して月収100万円」を達成したプロや、現役で利益を出し続けているブロガーなど、確かな実績を持つプレイヤーのみで構成されています。そのため、机上の空論ではない、現場で通用する戦術を学ぶことができます。

副業に特化した強み

  • 最短ルートの提示: 未経験からでも実績を出せるよう、マンツーマンで指導。
  • AI活用の習得: 副業の時間対効果を最大化するための、正しいAI活用スキルも網羅。
  • 案件獲得のチャンス: 運営がWebマーケティング会社であるため、実力次第で社内案件の紹介など、仕事に直結する可能性があります。

受講者の多くは、「在宅でできる仕事を探している」「副業を頑張りたい」という20代・30代・40代が中心です。

受講前には、講師による無料説明が行われます。無理な勧誘はなく、自分に合った副業スタイルやプランを相談できるため、まずは話を聞いてみることから始めてみてはいかがでしょうか。

ブログで稼ぎたいなら「メイカラ」

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次