Всякий раз, когда вы делаете new int[X]
где X
целое, как в C++ и Java, вы получите ссылку на вновь выделенный массив.
В Java массивы автоматически инициализируются так, что каждая запись имеет значение по умолчанию (0 для примитивных типов данных, null для ссылочных типов данных). В C++ массив не инициализирован, вы получаете мусор на нем.
Если вы:
array = new int[10];
array[0] = 0;
array[1] = 1;
// etc
array = new int[15];
второй раз, когда вы создаете массив и поместить ссылку на него в переменной array
, вы просто потеряете ссылку на ваш первый массив. Поскольку это массив , он будет подчиняться правилам языка для новых распределенных массивов: в Java массив теперь укажет на массив размером 15, заполненный нулями; в C++ массив укажет на массив размером 15, заполненный мусором.
В Java потерянный массив будет в конечном итоге собранным для вас мусором. В C++ вы только что создали утечку памяти.
Оба языка запрещают вам изменения размера или, как вы выразились, динамически расширять массив. Вы можете создать новую, скопировать все из старой в новую и отказаться от старой. Они могут предоставлять методы, которые делают эти операции для вас, но вы не будете расширять существующий массив, вы просто создадите новый и скопируете данные из старого в новый.
В Java нет перераспределить (но это имеет Arrays.copyOf
, который работает аналогично), и в C++ (и C, а), realloc
не очень продлить массива; он будет выделять больше памяти в другом месте, освободить ранее выделенную память и вернуть новый указатель: вам придется заменить любые существующие указатели на новый адрес!
Наконец, для классов коллекций, которые динамически изменяют размер, обычно они имеют внутренний массив и, всякий раз, когда этот массив заполняется, класс выполняет все внутренние изменения: он выделяет новый, больше, копирует элементы и отбрасывает Старый. Поскольку массив полностью инкапсулирован в класс, вам не нужно беспокоиться о ссылках на старый массив, как я объяснял выше.
Вы правы. Он будет заменен массивом нулей в Java. – asteri
Нет, он заменит массив случайных значений (на самом деле то, что было в памяти раньше). C++ не инициализирует содержимое массива! – Marius
Я думаю, что это слишком неопределенный вопрос - несколько вопросов на разных языках ... –