問題のコード:
void deleteForMe(int* pointer) { delete[] pointer; }
ポインターが指していない場合の動作は未定義ですdelete[] 操作を盲目的に実行するため、配列になります。ただし、
int main() { int* arr = new int[5]; deleteForMe(arr); return 0; }
のようにポインタが配列を参照する場合、OS はどういうわけか、指定された配列要素のみを削除し、それ以降は続行しないことを認識します。
この動作の鍵は次のとおりです。 C 互換言語としての C の歴史的ルーツにあります。配列を使用しないプログラマに不必要なオーバーヘッドの負担を与えないよう、delete[] 構文が導入されました。
次のような非配列割り当てが行われる場合、
Foo* foo = new Foo;
追加は不要です。配列のサポートにはオーバーヘッドが発生します。ただし、配列割り当ての場合、このオーバーヘッドは存在します。ランタイム ライブラリがこの情報を使用する必要があることを示すには、プログラマは配列ポインタに delete[] を指定する必要があります。
したがって、delete と delete[] の選択は、削除される特定の割り当てに基づいて行われます。これにより、よりきめ細かいメモリ管理が可能になり、C のミニマリズムの哲学と一致します。
以上が`delete[]` は配列から削除する要素の数をどのようにして知るのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。