C ++のdelete
と演算子の違いは何ですか?delete[]
6 に答える
演算子はメモリのdelete
割り当てを解除し、で作成された単一のオブジェクトのデストラクタを呼び出しますnew
。
演算子はメモリのdelete []
割り当てを解除し、で作成されたオブジェクトの配列に対してデストラクタを呼び出しますnew []
。
によって返されるポインタまたはdelete
によって返されるポインタで使用すると、未定義の動作が発生します。new []
delete []
new
演算子は、delete[]
配列を削除するために使用されます。演算子は、delete
非配列オブジェクトを削除するために使用されます。配列の要素または非配列オブジェクトのデストラクタを(最終的に)呼び出した後に、配列または非配列オブジェクトが占有していたメモリを削除するために、それぞれ呼び出しoperator delete[]
および関数を実行します。operator delete
以下に関係を示します。
typedef int array_type[1];
// create and destroy a int[1]
array_type *a = new array_type;
delete [] a;
// create and destroy an int
int *b = new int;
delete b;
// create and destroy an int[1]
int *c = new int[1];
delete[] c;
// create and destroy an int[1][2]
int (*d)[2] = new int[1][2];
delete [] d;
new
配列を作成する(つまり、またはnew type[]
配列new
型構造に適用される)の場合、標準はoperator new[]
配列の要素型クラスまたはグローバルスコープでを検索し、要求されたメモリ量を渡します。必要以上に要求するN * sizeof(ElementType)
場合があります(たとえば、要素の数を格納するため、後で削除するときに、実行するデストラクタ呼び出しの数がわかります)。operator new[]
クラスがメモリ量の追加で別のを受け入れることを宣言した場合size_t
、その2番目のパラメータは割り当てられた要素の数を受け取ります-これは必要な目的(デバッグなど)に使用できます。
new
非配列オブジェクトを作成するのは、要素のクラスまたはグローバルスコープでを検索しますoperator new
。要求されたメモリの量を渡します(正確にsizeof(T)
常に)。
の場合delete[]
、配列の要素クラスタイプを調べて、それらのデストラクタを呼び出します。使用されるoperator delete[]
関数は、要素タイプのクラスにある関数です。存在しない場合は、グローバルスコープにあります。
のdelete
場合、渡されるポインタが実際のオブジェクトのタイプの基本クラスである場合、基本クラスには仮想デストラクタが必要です(そうでない場合、動作は未定義です)。基本クラスでない場合は、そのクラスのデストラクタが呼び出され、operator delete
そのクラスのinまたはグローバルoperator delete
が使用されます。基本クラスが渡された場合は、実際のオブジェクトタイプのデストラクタが呼び出されoperator delete
、そのクラスで見つかったものが使用されます。存在しない場合は、グローバルoperator delete
が呼び出されます。operator delete
クラス内にタイプの2番目のパラメーターがある場合、size_t
割り当てを解除する要素の数を受け取ります。
malloc
これは、c ++ / free
、new
/ delete
、new[]
/でのallocate/DE-allocateパターンの基本的な使用法です
。delete[]
それに応じて使用する必要があります。delete
しかし、私はとの違いについてこの特定の理解を追加したいと思いますdelete[]
1)単一のオブジェクトdelete
に割り当てられたメモリの割り当てを解除するために使用されます
2)オブジェクトの配列にdelete[]
割り当てられたメモリの割り当てを解除するために使用されます
class ABC{}
ABC *ptr = new ABC[100]
と言うとnew ABC[100]
、コンパイラは、割り当てる必要のあるオブジェクトの数(ここでは100)に関する情報を取得し、作成された各オブジェクトのコンストラクタを呼び出します。
しかし、それに対応して、この場合に単純に使用するdelete ptr
と、コンパイラは、ポイントしているオブジェクトの数を認識せずptr
、デストラクタを呼び出して1つのオブジェクトのメモリを削除します(デストラクタの呼び出しと残りの99個のオブジェクトの割り当て解除を残します)。したがって、メモリリークが発生します。
delete [] ptr
したがって、この場合はを使用する必要があります。
演算子delete
とdelete []
はそれぞれ、new
とで作成されたオブジェクトを破棄するためnew[]
に使用され、コンパイラのメモリマネージャで使用可能なままになっている割り当てられたメモリに戻ります。
で作成されたオブジェクトは必ずでnew
破棄する必要がありdelete
、で作成した配列new[]
はで削除する必要がありdelete[]
ます。
この質問をしたとき、私の本当の質問は、「2つの間に違いはありますか?ランタイムは配列サイズに関する情報を保持する必要がないので、どちらを意味するのかわかりませんか?」でした。この質問は「関連する質問」には表示されないので、私のような人を助けるために、「なぜdelete []演算子が必要なのですか?」という答えがあります。
delete
単一のポインターにdelete[]
使用され、ポインターを介して配列を削除するために使用されます。
これは、理解を深めるのに役立つ場合があります。