2

intの配列を割り当てるとしましょう

int test[] = new int[100];

私は真ん中のどこかにポインターを取ります

int *temp = &test[50];

次に、一時的に delete[] を呼び出します

delete[] temp

この場合、コンパイラは削除する要素のサイズをどのように知るのでしょうか?

4

4 に答える 4

8

それはありません(または、私にはわかりません)。未定義の動作を呼び出しています。delete[]で割り当てられたポインターでのみ呼び出すことができますnew[]

たとえば、MSVS でクラッシュが発生します。

于 2012-06-08T07:13:30.630 に答える
3

によって返されたのと同じメモリ位置を渡す必要がありますnew[]。それ以外のものを渡すことは未定義の動作です。

于 2012-06-08T07:14:16.010 に答える
1

答えはノーだ。削除演算子は、メモリ ブロックの場所とそのサイズを特定する必要があるため、割り当てられた配列の最初のメンバーよりもほとんど先になります。「Inside c++ object model」をご覧ください。

于 2012-06-08T07:17:04.687 に答える
1

それをしてはいけない。コンパイラは、割り当てたメモリのサイズを追跡する必要があります。規格は、これをどのようにしなければならないかを述べていません。一部のコンパイラは、返されたアドレスの直前に割り当てられたメモリのサイズを格納します。そのような場合、あなたがしていることは未定義の動作につながる可能性があります。

于 2012-06-08T07:15:27.323 に答える