delete 演算子 (C++)delete Operator (C++)

メモリのブロックを解放します。Deallocates a block of memory.


[::] delete キャスト式[::] delete cast-expression
[::] delete [] キャスト式[::] delete [] cast-expression


キャスト式の引数は、 new 演算子で作成されたオブジェクトに対して以前に割り当てられたメモリブロックへのポインターである必要があります。The cast-expression argument must be a pointer to a block of memory previously allocated for an object created with the new operator. Delete演算子の結果はvoid型であるため、値を返しません。The delete operator has a result of type void and therefore does not return a value. 例えば:For example:

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

Newで割り当てられていないオブジェクトへのポインターに対してdeleteを使用すると、予測できない結果になります。Using delete on a pointer to an object not allocated with new gives unpredictable results. ただし、値が0のポインターに対してdeleteを使用することはできます。You can, however, use delete on a pointer with the value 0. このようにプロビジョニングすると、新しいエラーが発生した場合に、新しい操作の結果を削除しても問題はありません。This provision means that, when new returns 0 on failure, deleting the result of a failed new operation is harmless. 詳細については、「 new および Delete 演算子」を参照してください。For more information, see The new and delete Operators.

New演算子とdelete演算子は、配列を含む組み込み型にも使用できます。The new and delete operators can also be used for built-in types, including arrays. pointer配列を参照している場合は、[]次のpointer前に空の角かっこ () を配置します。If pointer refers to an array, place empty brackets ([]) before pointer:

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

オブジェクトに対してdelete演算子を使用すると、そのメモリの割り当てが解除されます。Using the delete operator on an object deallocates its memory. オブジェクトを削除した後でポインターを逆参照するプログラムは、予期しない結果になるか、クラッシュする可能性があります。A program that dereferences a pointer after the object is deleted can have unpredictable results or crash.

クラスオブジェクトのメモリの割り当てを解除するために delete を使用すると、オブジェクトのメモリの割り当てが解除される前に、オブジェクトのデストラクターが呼び出されます (オブジェクトにデストラクターがある場合)。 C++When delete is used to deallocate memory for a C++ class object, the object's destructor is called before the object's memory is deallocated (if the object has a destructor).

Delete演算子のオペランドが変更可能な左辺値の場合、オブジェクトが削除された後、その値は未定義になります。If the operand to the delete operator is a modifiable l-value, its value is undefined after the object is deleted.

/Sdl (追加のセキュリティチェックを有効にする)コンパイラオプションが指定されている場合、 delete演算子のオペランドは、オブジェクトが削除された後、無効な値に設定されます。If the /sdl (Enable additional security checks) compiler option is specified, the operand to the delete operator is set to an invalid value after the object is deleted.

delete の使用Using delete

Delete 演算子には2つの構文バリアントがあります。1つは単一オブジェクト用で、もう1つはオブジェクトの配列です。There are two syntactic variants for the delete operator: one for single objects and the other for arrays of objects. 次のコードフラグメントは、両者の違いを示しています。The following code fragment shows how they differ:

// 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 []れます。オブジェクトに対して array 形式の delete () を使用し、配列で delete の nonarray 形式を使用します。The following two cases produce undefined results: using the array form of delete (delete []) on an object, and using the nonarray form of delete on an array.


Deleteの使用例については、「 new operator」を参照してください。For examples of using delete, see new operator.

delete の動作方法How delete works

Delete 演算子は、関数operator deleteを呼び出します。The delete operator invokes the function operator delete.

クラス型 (クラス構造体、または共用体) ではないオブジェクトの場合、グローバルな delete 演算子が呼び出されます。For objects not of class type (class, struct, or union), the global delete operator is invoked. クラス型のオブジェクトの場合、delete 式が単項スコープ解決演算子 (::) で始まる場合、割り当て解除関数の名前はグローバルスコープで解決されます。For objects of class type, the name of the deallocation function is resolved in global scope if the delete expression begins with the unary scope resolution operator (::). それ以外の場合、delete 演算子は、メモリ (ポインターが null でない場合) の割り当てを解除する前に、オブジェクトのデストラクターを呼び出します。Otherwise, the delete operator invokes the destructor for an object prior to deallocating memory (if the pointer is not null). delete 演算子は、クラス単位で定義できます。指定のクラスの定義がない場合、グローバル delete 演算子が呼び出されます。The delete operator can be defined on a per-class basis; if there is no such definition for a given class, the global operator delete is invoked. 静的な型に仮想デストラクターが含まれるクラス オブジェクトの割り当ての解放に delete 式を使用した場合、deallocation 関数は動的な型のオブジェクトの仮想デストラクターを通じて解決されます。If the delete expression is used to deallocate a class object whose static type has a virtual destructor, the deallocation function is resolved through the virtual destructor of the dynamic type of the object.

関連項目See also

単項演算子を含む式Expressions with Unary Operators
new および delete 演算子new and delete Operators