intの配列を割り当てるとしましょう
int test[] = new int[100];
私は真ん中のどこかにポインターを取ります
int *temp = &test[50];
次に、一時的に delete[] を呼び出します
delete[] temp
この場合、コンパイラは削除する要素のサイズをどのように知るのでしょうか?
intの配列を割り当てるとしましょう
int test[] = new int[100];
私は真ん中のどこかにポインターを取ります
int *temp = &test[50];
次に、一時的に delete[] を呼び出します
delete[] temp
この場合、コンパイラは削除する要素のサイズをどのように知るのでしょうか?
それはありません(または、私にはわかりません)。未定義の動作を呼び出しています。delete[]
で割り当てられたポインターでのみ呼び出すことができますnew[]
。
たとえば、MSVS でクラッシュが発生します。
によって返されたのと同じメモリ位置を渡す必要がありますnew[]
。それ以外のものを渡すことは未定義の動作です。
答えはノーだ。削除演算子は、メモリ ブロックの場所とそのサイズを特定する必要があるため、割り当てられた配列の最初のメンバーよりもほとんど先になります。「Inside c++ object model」をご覧ください。
それをしてはいけない。コンパイラは、割り当てたメモリのサイズを追跡する必要があります。規格は、これをどのようにしなければならないかを述べていません。一部のコンパイラは、返されたアドレスの直前に割り当てられたメモリのサイズを格納します。そのような場合、あなたがしていることは未定義の動作につながる可能性があります。