7
int* arr = new int[count];

delete arr;

なぜこれが機能するのですか?確認しましたが、実際にメモリが解放されます。私が読んだことから、delete[] arr;そうしないと実際にすべてのメモリが解放されるわけではありません。

4

3 に答える 3

13

違いは、割り当てられたメモリが適切に解放されているかどうかではありません-使用するかどうか

delete

また

delete[]

メモリは引き続き適切に割り当て解除されます。

違いは、デストラクタが適切に呼び出されるかどうかです。

delete // will only invoke the destructor of the first element of the array.

delete[] // will invoke the destructor for *each* element of the array.

これは int や float などのプリミティブ型には実際的な影響はありませんが、何らかのクラスの配列がある場合、その違いは重大になる可能性があります。

于 2013-08-04T19:18:06.523 に答える
9

配列にそれぞれ 100 バイトの文字列を入力してみて、割り当てられたメモリがすべて解放されるかどうかを確認してください...

これは未定義の動作であり、いつものように、UB が機能しているように見えることがあります。あなたの場合、メモリ内のオブジェクトのデストラクタがないため、「それ以上の作業」はなく、すべてのメモリを解放するだけです[1]。しかし、何か役に立つデストラクタを持つオブジェクトがある場合、それは (おそらく) 呼び出されません。

以前に割り当てていたdelete []場合は、常に使用する必要があります。new T[size];2 つを混ぜないでください。常に間違っています - 時々うまくいくことがあります [インチ単位のスパナの一部のサイズが mm ナットで機能し、その逆のように - しかし、インチ単位のスパナ セットをメートル法ナットで使用するのは依然として間違っています]。

[1] これは、この特定のコンパイラと C++ ライブラリの組み合わせで機能する可能性があることに注意してください。別のコンパイラでコンパイルしたり、別の C++ ライブラリを使用したり、別の OS 用にコンパイルしたりすると、同じことをしようとするとクラッシュする可能性があります。

于 2013-08-04T19:15:05.247 に答える
3

delete と delete [] は実際には異なる演算子であり、間違った演算子を使用すると常にエラーになります。問題は、多くの場合、その時点では問題ないように見えますが、ヒープが破損しており、明らかに関係のないクラッシュが後で発生する可能性が非常に高いことです。

于 2013-08-04T19:13:30.680 に答える