9

なぜあるのdelete[]ですか?私の理解では、配列の動作が異なります。しかし、なぜそれは本当に存在するのですか?C には free しかなく、free_array はありません。delete varまた、構文では、との唯一の違いdelete []varは、[]パラメーターがないことです (配列の長さはわかりません)。

では、なぜdelete[]実際に存在するのでしょうか。deleteオーバーロードできると誰かが言うことは知っていますがdelete[](少なくとも私はそれが可能だと思います)、オーバーロードしていないとしましょう。なぜそれが存在するのですか?

4

4 に答える 4

19

通常、POD 以外のクラスの場合、delete[]式は、コンパイル時に決定できない可変数のクラス インスタンスでデストラクタを呼び出す必要があります。コンパイラは通常、破棄するオブジェクトの正しい数を決定するために使用できる実行時の「魔法」を実装する必要があります。

式はこれdeleteについて心配する必要はありません。指定されたポインターが指している 1 つのオブジェクトを単に破棄する必要があります。このため、より効率的な実装が可能です。

とを分割することdeletedelete[]delete正しく実装するために必要なオーバーヘッドも発生させずに実装できますdelete[]

于 2010-09-12T09:33:37.623 に答える
3

配列を削除すると、最初のオブジェクトのデストラクタのみが呼び出されます。delete[]は、配列内のすべてのオブジェクトのデストラクタを呼び出し、配列のメモリを解放します。

于 2010-09-12T09:33:31.010 に答える
3

delete[] が存在しないと仮定して、配列を削除するコードと、配列の最初の要素のみを削除するコードを記述します。

delete array;        // Deletes first element, oops    
delete &array;       // Deletes first element, oops
delete &array[0];    // Deletes first element

配列の最初の要素へのポインターのエイリアスである配列へのポインターは、もちろん古い C の「機能」です。

于 2010-09-12T09:37:20.427 に答える
1

検討:

int* a = new int[25];
int* b = a;

delete b;  // only deletes the first element

C++ コンパイラは、 b が配列を指しているのか単一の要素を指しているのかわかりません。delete配列を呼び出すと、最初の要素のみが削除されます。

于 2010-09-12T09:53:10.310 に答える