新しい T[] で割り当てられた配列はそのサイズを公開できますか?
対応する delete[] とは異なり、本質的にサイズを知っています。割り当てられた配列に対して、C には new T[] を使用して作成された配列のサイズをプログラムで確認するメカニズムがありません。
区別の詳細
この相違の核心は次のとおりです。 delete[] の本質的な性質にあります。コンパイル中、配列のサイズはランタイムまたはオペレーティング システムのメモリ マネージャーによって細心の注意を払って保存されます。ただし、コンパイラはこの情報にアクセスできないままです。逆に、本物の関数ではなくコンパイラのオペランドである sizeof() は、コンパイル時に配列の範囲が不確実であるため、動的に割り当てられた配列のサイズを決定できません。
説明例
次のコード サンプルを考えてみましょう:
int *arr = new int[256]; int *p = &arr[100]; printf("Size: %d\n", sizeof(p));
ここで、コンパイラは、p のサイズをどのように決定するかという複雑なジレンマに直面しています。配列のポインタには、割り当てられたメモリ ブロックの開始または終了に関する固有の知識がありません。これらは、ブロックの先頭、ブロック内の特定の要素、または任意の位置を示す場合があります。
固有の制限
ファーストクラスとは異なり、C および C 配列オブジェクトはポインタに縮退します。コンパイラとプログラムは同様に、ポインタが新しいブロック、個々のオブジェクト、または中間アドレスの開始を識別するかどうかを認識しません。
この設計上の選択は、 C および C のメモリ管理の委任された性質に由来しており、それをプログラマとオペレーティング システムに伝えます。新規実装と削除実装はプラットフォームやシナリオによって大きく異なるため、C 標準内での標準化が妨げられます。
以上がC の `new T[]` で割り当てられた配列のサイズを決定できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。