誰かが. int* nums = new int[3]
_ コンパイラは、使用したい任意の手法を使用できますが、一般的な手法が 2 つあります。3
nums
によって生成されるコードはnums = new int[3]
、数値3
を静的な連想配列に格納する場合があります。この配列では、ポインターnums
がルックアップ キーとして使用され、数値3
が関連付けられた値になります。によって生成されたコードdelete[] nums
は、連想配列内のポインターを検索し、関連する size_t を抽出してから、連想配列からエントリを削除します。
によって生成されたコードはnums = new int[3]
、追加の sizeof(size_t) バイトのメモリ (場合によってはいくつかのアライメント バイトを加えたもの) を割り当て、最初のオブジェクト3
の直前に値を配置する場合があります。int
次に、最初のオブジェクトの前 (つまり の前) の固定オフセットを調べてdelete[] nums
見つけ、割り当ての先頭 (つまり の前の固定オフセットから始まるメモリのブロック) から始まるメモリの割り当てを解除します。3
int
*num
*nums
どちらの技術も完璧ではありません。いくつかのトレードオフを次に示します。
連想配列の手法は時間がかかりますが、より安全です。誰かが[]
物の配列の割り当てを解除するときに を忘れた場合、(a) 連想配列のエントリがリークし、(b) 配列の最初のオブジェクトだけが破棄されます。これは重大な問題である場合もそうでない場合もありますが、少なくともアプリケーションがクラッシュすることはないかもしれません。
オーバーアロケーション手法は高速ですが、より危険です: 誰かが言うdelete nums
べき場所を言った場合delete[] nums
、operator に渡されるアドレスはdelete(void* nums)
有効なヒープ割り当てではなくなります — 少なくともsizeof(size_t)
有効なヒープ割り当ての後のバイトになります。これにより、ヒープが破損する可能性があります。- C++ FAQ