delete 演算子 (C++)

メモリのブロックを解放します。

構文

[::] deletecast-expression
[::] delete []cast-expression

解説

cast-expression 引数は、前に new 演算子で作成されたオブジェクトに割り当てられたメモリ ブロックへのポインターである必要があります。 delete 演算子は、型 void の結果を持つため、値を返しません。 次に例を示します。

CDialog* MyDialog = new CDialog;
// use MyDialog
delete MyDialog;

new で割り当てられていないオブジェクトへのポインターに対して delete を使用すると、予期しない結果になります。 ただし、値 0 のポインターに対して delete を使用することはできます。 このプロビジョニングは、new が失敗時に 0 を返す場合、失敗した new 操作の結果を削除しても無害であることを意味します。 詳細については、「new および delete 演算子」を参照してください。

newdelete 演算子は、配列も含めて、組み込み型にも使用できます。 pointer が配列を参照している場合は、pointer の前に空のかっこ ([]) を記述します。

int* set = new int[100];
//use set[]
delete [] set;

オブジェクトに対して delete 演算子を使用すると、そのメモリが解放されます。 オブジェクトを削除した後でポインターを逆参照するプログラムは、予期しない結果になるか、クラッシュする可能性があります。

C++ クラス オブジェクトのメモリを解放するために delete を使用すると、オブジェクトのメモリを解放する前に、オブジェクトのデストラクターが呼び出されます (オブジェクトにデストラクターが存在する場合)。

delete 演算子のオペランドが変更可能な左辺値である場合、オブジェクトを削除した後のその値は未定義になります。

/sdl (追加のセキュリティチェックを有効にする) コンパイラ オプションが指定されている場合、オブジェクトが削除された後、演算子のオペランド delete が無効な値に設定されます。

delete の使用

delete 演算子には 2 つの構文バリアントがあります。単一のオブジェクトを対象とするものと、オブジェクトの配列を対象とするものです。 次のコードは、これらがどのように違うかを示します。

// expre_Using_delete.cpp
struct UDType
{
};

int main()
{
   // Allocate a user-defined object, UDObject, and an object
   //  of type double on the free store using the
   //  new operator.
   UDType *UDObject = new UDType;
   double *dObject = new double;
   // Delete the two objects.
   delete UDObject;
   delete dObject;
   // Allocate an array of user-defined objects on the
   // free store using the new operator.
   UDType (*UDArr)[7] = new UDType[5][7];
   // Use the array syntax to delete the array of objects.
   delete [] UDArr;
}

次の 2 つのケースで、オブジェクトに対して配列形式の delete (delete []) を使用した場合、および配列に対して非配列形式の delete を使用した場合は、未定義の結果が生成されます。

delete の使い方の例については、「new 演算子」を参照してください。

delete の動作方法

delete 演算子は、関数 演算子 delete を呼び出します。

クラス型 (classstruct、または union) ではないオブジェクトでは、グローバルな delete 演算子が呼び出されます。 クラス型のオブジェクトでは、delete 式の先頭が単項スコープ解決演算子 (::) である場合に、deallocation 関数の名前がグローバル スコープで解決されます。 それ以外の場合、delete 演算子は、メモリ (ポインターが null でない場合) の割り当てを解除する前に、オブジェクトのデストラクターを呼び出します。 delete 演算子は、クラス単位で定義できます。指定のクラスの定義がない場合、グローバル delete 演算子が呼び出されます。 静的な型に仮想デストラクターが含まれるクラス オブジェクトの割り当ての解放に delete 式を使用した場合、deallocation 関数は動的な型のオブジェクトの仮想デストラクターを通じて解決されます。

関連項目

単項演算子を含む式
キーワード
new および delete 演算子