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
のデストラクタは、割り当てられたメモリが解放されることを保証します。