違いは何であるdelete
とdelete[]
C ++の演算子が?
vector<>
であり、可能な場合は常に配列の代わりに使用します。
std::unique_ptr<int>(new int[3])
、たとえば、delete
未定義の動作である配列でregularを呼び出すため、たとえば、書き込みを行わないことを知る必要があるという意味で、違いを知る必要があります。代わりに使用する必要がありますstd::unique_ptr<int[]>
違いは何であるdelete
とdelete[]
C ++の演算子が?
vector<>
であり、可能な場合は常に配列の代わりに使用します。
std::unique_ptr<int>(new int[3])
、たとえば、delete
未定義の動作である配列でregularを呼び出すため、たとえば、書き込みを行わないことを知る必要があるという意味で、違いを知る必要があります。代わりに使用する必要がありますstd::unique_ptr<int[]>
回答:
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
配列型構成に適用される)の場合、Standardは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
割り当てを解除する要素の数を受け取ります。
これは、c ++のallocate / DE-allocateパターンの基本的な使用法
malloc
/ free
、new
/ delete
、new[]
/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
この場合は使用する必要があります。
free()
これとこれだけです。擬似デストラクタパターンを使用する場合は、for
ループを使用してオブジェクトごとに1回呼び出す必要があります。
私がこの質問をしたとき、私の本当の質問は、「2つの間に違いはありますか?ランタイムは配列サイズに関する情報を保持する必要がないので、どちらが意味するのかを見分けることができないのですか?」ということでした。この質問は「関連する質問」には表示されないので、私のような人を助けるために、ここでその答えを示します。「なぜdelete []演算子が必要なのですか?」