164

C ++のdeleteと演算子の違いは何ですか?delete[]

4

6 に答える 6

194

演算子はメモリのdelete割り当てを解除し、で作成された単一のオブジェクトのデストラクタを呼び出しますnew

演算子はメモリのdelete []割り当てを解除し、で作成されたオブジェクトの配列に対してデストラクタを呼び出しますnew []

によって返されるポインタまたはdeleteによって返されるポインタで使用すると、未定義の動作が発生します。new []delete []new

于 2010-03-11T14:34:55.850 に答える
93

演算子は、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割り当てを解除する要素の数を受け取ります。

于 2010-03-11T14:37:35.143 に答える
26

mallocこれは、c ++ / freenew/ deletenew[]/での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したがって、この場合はを使用する必要があります。

于 2014-06-25T10:14:11.163 に答える
6

演算子deletedelete []はそれぞれ、newとで作成されたオブジェクトを破棄するためnew[]に使用され、コンパイラのメモリマネージャで使用可能なままになっている割り当てられたメモリに戻ります。

で作成されたオブジェクトは必ずでnew破棄する必要がありdelete、で作成した配列new[]はで削除する必要がありdelete[]ます。

于 2010-03-11T14:35:18.550 に答える
5

この質問をしたとき、私の本当の質問は、「2つの間に違いはありますか?ランタイムは配列サイズに関する情報を保持する必要がないので、どちらを意味するのかわかりませんか?」でした。この質問は「関連する質問」には表示されないので、私のような人を助けるために、「なぜdelete []演算子が必要なのですか?」という答えがあります。

于 2018-01-31T09:02:31.630 に答える
-1

delete単一のポインターにdelete[]使用され、ポインターを介して配列を削除するために使用されます。 これは、理解を深めるのに役立つ場合があります。

于 2014-11-26T13:37:32.613 に答える