new int[X]
C++ と Java の両方で where is a integerを実行X
すると、新しく割り当てられた配列への参照が取得されます。
Java では、各エントリがデフォルト値 (プリミティブ データ型の場合は 0、参照データ型の場合は null) を持つように配列が自動的に初期化されます。C++ では、配列は初期化されないため、ガベージが発生します。
もしあなたがそうするなら:
array = new int[10];
array[0] = 0;
array[1] = 1;
// etc
array = new int[15];
2 回目に配列を作成し、それへの参照を variablearray
に入れると、最初の配列への参照が失われます。これは新しい配列であるため、配列を新しく割り当てるための言語の規則に従います。Java では、配列はゼロで埋められたサイズ 15 の配列を指すようになります。C++ では、array はガベージで満たされたサイズ 15 の配列を指します。
Java では、失われた配列は最終的にガベージ コレクションされます。C++ では、メモリ リークが発生しました。
どちらの言語でも、サイズを変更したり、配列を動的に拡張したりすることは禁止されています。新しいものを作成し、古いものから新しいものにすべてをコピーし、古いものを破棄できます。これらの操作を行うメソッドを提供する場合がありますが、既存の配列を拡張することはありません。単に新しい配列を作成し、古い配列から新しい配列にデータをコピーするだけです。
Java にはreallocはなく(ただし、Arrays.copyOf
同様に機能する があります)、C++ (および C も同様) では、実際には配列を拡張realloc
しません。他の場所により多くのメモリを割り当て、以前に割り当てられたメモリの割り当てを解除し、新しいポインタを返します。既存のポインタを新しいアドレスに置き換える必要があります!
最後に、動的にサイズを変更するコレクション クラスの場合、通常、内部配列があり、その配列がいっぱいになると、クラスはすべてのサイズ変更を内部で行います。つまり、より大きな新しいものを割り当て、要素をコピーし、古いものを破棄します。配列はクラスに完全にカプセル化されているため、上で説明した古い配列への参照について心配する必要はありません。