Динамическое выделение массивов в C++: практическое руководство с примерами кода
Что такое динамический массив?
Динамический массив похож на обычный массив, но его размер можно изменять во время выполнения программы. Элементы динамического массива занимают непрерывный блок памяти.
После создания обычного массива его размер изменить нельзя. Динамический массив же может расширяться даже после заполнения.
При создании обычному массиву выделяется заранее заданное количество памяти. Динамический массив увеличивает свой размер по определённому фактору при необходимости.
В этом уроке вы узнаете:
- Что такое динамический массив
- Факторы, влияющие на производительность
- Ключевое слово
new - Инициализация динамически выделенных массивов
- Изменение размера массивов
- Удаление динамических массивов
Факторы, влияющие на производительность динамических массивов
Начальный размер массива и его коэффициент роста определяют производительность. Обратите внимание:
- Если массив имеет маленький размер и малый коэффициент роста, он будет часто перераспределять память, снижая производительность.
- Если массив имеет большой размер и большой коэффициент роста, будет много неиспользуемой памяти; операции изменения размера могут занимать больше времени, также снижая производительность.
Ключевое слово new
В C++ динамический массив создаётся с помощью ключевого слова new. Количество выделяемых элементов указывается в квадратных скобках. Перед ними должен стоять имя типа. Выделится запрошенное число элементов.
Синтаксис:
указатель = new тип[количество];
указатель — имя указательной переменной.
тип — любой допустимый тип C++.
Оператор new возвращает указатель на первый элемент. После использования динамический массив удаляется через delete.
Пример 1: Создание и заполнение динамического массива
#include <iostream>
using namespace std;
int main() {
int x, n;
cout << "Enter the number of items:" << "\n";
cin >> n;
int *arr = new int[n];
cout << "Enter " << n << " items" << endl;
for (x = 0; x < n; x++) {
cin >> arr[x];
}
cout << "You entered: ";
for (x = 0; x < n; x++) {
cout << arr[x] << " ";
}
return 0;
}
Вывод:

Скриншот кода:

Разбор кода:
- Подключаем
iostreamдля консольного ввода/вывода. - Используем пространство имён
std. - Вызываем
main(). - Объявляем целочисленные переменные
xиn. - Выводим приглашение ввести количество элементов.
- Считываем ввод пользователя в переменную
n. - Выделяем динамический массив на
nцелых чисел, сохраняем указатель вarr. - Просим ввести
nэлементов. - Цикл
forдля итерации по вводимым элементам. - Считываем элементы в массив
arr. - Конец цикла.
- Выводим вводный текст.
- Цикл
forдля вывода элементов массива. - Печатаем значения массива
arr. - Конец цикла.
- Программа возвращает значение при успешном завершении.
- Конец
main().
ВАЖНО: В этом примере пользователь сам задаёт размер массива во время выполнения — размер определяется в runtime.
Инициализация динамически выделенных массивов
Легко инициализировать динамический массив нулями.
Синтаксис:
int *array{ new int[length]{} };
Здесь length — количество элементов. Поскольку инициализируем нулями, список инициализаторов оставляем пустым.
Можно инициализировать список инициализаторов. Пример:
Пример 2: Инициализация списком
#include <iostream>
using namespace std;
int main(void) {
int x;
int *array{ new int[5]{ 10, 7, 15, 3, 11 } };
cout << "Array elements: " << endl;
for (x = 0; x < 5; x++) {
cout << array[x] << endl;
}
return 0;
}
Вывод:

Скриншот кода:

Разбор кода:
- Подключаем
iostream. - Используем
std. - Вызываем
main(). - Объявляем
int x. - Объявляем динамический массив
arrayс инициализатором. Массив из 5 целых. Обратите внимание: оператор=между длиной и списком не используется. - Выводим текст.
endl— переход на новую строку. - Цикл
forпо элементам массива. - Печатаем содержимое массива.
- Конец цикла.
- Возврат 0 при успехе.
- Конец
main().
Изменение размера массивов
Длина динамического массива задаётся при выделении.
Однако в C++ нет встроенного механизма изменения размера уже выделенного массива.
Можно обойти это: выделить новый массив, скопировать элементы, удалить старый.
Примечание: этот способ подвержен ошибкам, старайтесь его избегать. Лучше используйте std::vector, который управляет размером автоматически.
Удаление динамических массивов
Динамический массив нужно удалять из памяти после использования. Оператор delete освобождает память для повторного использования. Даже если не удалить явно, память вернётся системе при завершении программы.
Важно:
Для удаления массива используйте delete[], а не delete. Скобки [] говорят процессору удалить множество элементов, а не один. Использование delete вместо delete[] для массива приводит к утечкам памяти, повреждению данных, крашам.
Пример 3: Использование delete[]
#include <iostream>
using namespace std;
int main() {
int x, n;
cout << "How many numbers will you type?" << "\n";
cin >> n;
int *arr = new int[n];
cout << "Enter " << n << " numbers" << endl;
for (x = 0; x < n; x++) {
cin >> arr[x];
}
cout << "You typed: ";
for (x = 0; x < n; x++) {
cout << arr[x] << " ";
}
cout << endl;
delete [] arr;
return 0;
}
Вывод:

Скриншот кода:

Разбор кода:
- Подключаем
iostream. - Используем
std. - Вызываем
main(). - Объявляем
int x, n. - Просим пользователя указать количество чисел.
- Считываем ввод в
n. - Выделяем массив на
nцелых через указательarr. - Просим ввести
nчисел. - Цикл
forпо вводимым числам. - Считываем числа в массив
arr. - Конец цикла.
- Выводим текст.
- Цикл
forпо элементам массива. - Печатаем значения массива.
- Конец цикла.
- Печатаем пустую строку.
- Освобождаем память массива
arrчерезdelete[]. - Возврат 0 при успехе.
- Конец
main().
Резюме:
- Обычные массивы имеют фиксированный размер, неизменяемый после объявления.
- Их размер определяется на этапе компиляции.
- Динамические массивы позволяют менять размер во время выполнения.
- Их размер определяется во время выполнения.
- Динамические массивы в C++ создаются через
new. - Квадратные скобки задают количество элементов.
- После использования память освобождается оператором
delete. - Для массивов используйте
delete[]— удаляет все элементы. deleteбез[]удаляет только один элемент.- Встроенного механизма изменения размера нет.
- При инициализации списком оператор
=не используется.
Язык C
- Массивы в C#: объявление, инициализация и операции
- Как передавать массивы в функции в C++: практическое руководство
- Динамическое выделение памяти в C: освоение malloc, calloc, realloc и free
- Массивы в C++: объявление, инициализация и работа с указателями
- Операторы в C++: типы, примеры и практические программы
- Оператор switch-case в C++: синтаксис, применение и практические примеры
- Структуры (struct) в C++: объяснение с практическим примером
- Освоение std::list в C++: синтаксис, функции и практические примеры
- C++ Struct vs Class: ключевые отличия, синтаксис и лучшие сценарии использования
- Сортировка выбором в Java: пошаговый пример и полный код