C++ で std::vector オブジェクトの割り当てを解除する

Hafiz Muhammad Zohaib 2023年10月12日
C++ で std::vector オブジェクトの割り当てを解除する

この記事では、C++/C で std::vector オブジェクトの割り当てを解除する方法について説明します。 最初に、自己コーディングされた割り当て解除の方法を確認し、その後、C++ で std::vector オブジェクトが動的に割り当て解除される方法を調べます。

C++ でのオブジェクトの割り当て解除

C++ でクラス オブジェクトが作成されると、constructor と呼ばれる特別なメンバー関数が自動的に呼び出され、いくつかの既定値でオブジェクトが初期化されます。 同様に、作成されたオブジェクトがスコープ外に出ると、特別なメンバー関数 destructor が自動的に呼び出されます。

この destructor 関数は、作成されたオブジェクトが占有していたすべてのメモリを解放します。 オブジェクトが占有しているメモリを解放するこのプロセスは、割り当て解除と呼ばれます。

std::vector オブジェクト

C++ では、std は名前空間であり、:: 演算子はスコープ演算子です。 このスコープ演算子は、識別子/クラスを探すクラス/名前空間をコンパイラに伝えます。

式が std::cout の場合、std 名前空間で cout 識別子を探すことを意味します。 同様に、std::vector は、std 名前空間でベクトル クラスを探すことを意味します。

割り当てを解除するには、まず、vector クラスのオブジェクトを作成する必要があります。 そのために、GCC コンパイラ C++11 で以下のコードを使用できます。

#include <iostream>
#include <vector>

int main() {
  // Create a vector containing integers
  std::vector<int> v = {7, 5, 16, 8};
}

std 名前空間には、上記のコードの複数の C++ ライブラリが含まれています。 最初に vector ライブラリを明示的に追加し、それを使用して std::vector<int> 型でベクターを初期化しました。

C++ でのベクトル解放の自己コーディング方法

以下のコードでは、ベクトルを削除するコマンドを明示的に記述しています。 これは、new キーワードを使用してベクトルを作成する場合にのみ適用されます。

new 演算子は、フリー ストアでのメモリ割り当ての問い合わせを通知します。 new 演算子は、十分なスペースがある場合にメモリを割り当て、それを初期化し、新しく作成および初期化されたメモリの場所をポインタ変数に提供します。

以下のコードでは、最初にベクトル ポインターを初期化し、次にそれが NULL かどうかを確認しています。 必要な計算を行った後、assert ステートメントを使用して、ベクトル ポインターが空でないことを確認しました。

次に、delete ステートメントを使用して、ベクターとその占有スペースを削除しました。

#include <cassert>
#include <iostream>
#include <vector>
using namespace std;

int main() {
  std::vector<int>* vec = new std::vector<int>;
  \\*** assert(vec != NULL);
  delete vec;
  return 0;
}

以下のコードを使用して、必要な計算を行った後に空のベクトルを割り当てることにより、割り当てられたメモリを vec によって解放しました。 コマンド std::vector<int>() は、ゼロ バイトの空のベクターを作成します。

最後のステートメントは、vec によって占有されているメモリをバイト単位でチェックします。

std::vector<int> vec;
\\***
\\*** vec = std::vector<int>();
std::cout << sizeof(decltype(vec.back())) * vec.capacity() << std::endl;

C++ でのベクトル解放の動的な方法

C++ では、関数内 (つまり、{....} 内) で std::vector オブジェクトを定義すると、ベクター クラス コンストラクターが自動的に呼び出され、ベクター オブジェクトが初期化されます。 関数の実行が終了すると (つまり、閉じ括弧 } に到達すると)、デストラクタが自動的に呼び出されます。

例えば、

void Foo() {
  std::vector<int> v;
  ...
}

C++ は、メソッドの実行時に v のデストラクタが呼び出されることを保証します。 std::vector のデストラクタは、割り当てられたメモリが解放されることを保証します。

関連記事 - C++ Vector