C++ のベクトル デストラクタ

Naila Saad Siddiqui 2023年10月12日
  1. C++ のデストラクタ
  2. C++ でのベクトルと文字列のデストラクタ
C++ のベクトル デストラクタ

この記事では、C++ でベクトルと文字列を作成するときのデストラクタとその使用について説明します。

C++ のデストラクタ

OOP パラダイムでは、デストラクタは各クラスに関連付けられたメンバー関数であり、クラスのオブジェクトが削除されるか、その有効期間が終了するたびに自動的に実行されます。 さらに、デストラクタは、ヒープ メモリ上に作成されたすべての変数に対して呼び出されます。

このような変数が削除されると、デストラクタが呼び出され、後で使用できるようにメモリが解放されます。

デストラクタは、タイル シンボル プレフィックス (~) を付けたクラス名と同じ名前で作成されます。 クラスでは、コンストラクタを使用して作成されたすべてのオブジェクトは、デストラクタを使用して削除されますが、作成とは逆の順序になります。

デストラクタの構文は次のとおりです。

~<className>() {
  // coding
}

クラスの例を考えてみましょう。

#include <iostream>
using namespace std;

class DestructorExample {
 public:
  DestructorExample() { cout << "In Constructor of DestructorExample" << endl; }

  ~DestructorExample() { cout << "In Destructor of DestructorExample"; }
};
int main() {
  DestructorExample t;
  return 0;
}

これにより、次の出力が得られます。

In Constructor of DestructorExample
In Destructor of DestructorExample

C++ でのベクトルと文字列のデストラクタ

std::vectorstd::string を使用している場合、それらのオブジェクトがスコープ外になると、デストラクタが自動的に呼び出されます。 これらのクラスには、対応するオブジェクトを削除する必要があるときに自動的にトリガーされるデストラクタが実装されています。

したがって、それらを明示的に呼び出したり実装したりする必要はありません。

ただし、あるクラスへのポインターのベクトルがある場合、これらのオブジェクトは次のように明示的に削除する必要があります。

#include <iostream>
#include <vector>

using namespace std;

class MyClass {
 public:
  MyClass() { cout << "Object Created" << endl; }

  ~MyClass() { cout << "Object Destroyed" << endl; }
};

int main() {
  vector<MyClass*> testVec;
  // Creating the objects
  MyClass* p = NULL;
  for (int i = 0; i < 3; i++) {
    p = new MyClass();
    testVec.push_back(p);
  }
  // Destroying the objects
  for (auto p : testVec) {
    delete p;
  }
  testVec.clear();

  return 0;
}

出力:

Object Created
Object Created
Object Created
Object Destroyed
Object Destroyed
Object Destroyed

ベクトルを繰り返し処理し、各オブジェクトを明示的に削除します。 ヒープ内のメモリが解放されました。 したがって、.clear() メソッドを使用して、ベクトルのすべての要素を削除できます。

MyClass* オブジェクトは明示的に削除する必要があります。 ベクターはこれらのオブジェクトを削除しません。 したがって、ベクトルに単純なクラス オブジェクトが存在する場合、それらのオブジェクトは自動的に削除されると言えます。

ただし、ポインターがある場合は、明示的に削除する必要があります。

関連記事 - C++ Destructor