初期の c++ では delete[10] a; のように要素数が必要だったんです。 だけどそれではあまりに使いづらいということで delete[] a; と書けるように工夫がされました。 よくある実装では new[] の際に何個確保したかを同時に記憶しておく手法がとられます。 new int [10] に対して、実際に確保される記憶域は struct intarray { size_t count_of_elements; int body[10]; }; (および必要なら境界整合のための padding 分をさらに追加し) new[] は内部で p=malloc(sizeof (intarray)) した上で - p->count_of_elements に要素数(この例では 10 )を記憶する - &(p->body[0]) を返却する delete[] は逆の動作、つまり - &(