C++ для начинающих: Динамические массивы и память

Динамическая память в C++

C++ разрабатывался в эпоху менее мощных компьютеров, поэтому эффективное управление памятью было критически важным. Язык реализует концепцию динамической памяти: возможность занять оперативную память на определённое время, использовать её и затем освободить. Это аналогично аренде памяти.

Ограниченный объём оперативной памяти актуален даже для современных компьютеров. Создание переменных, массивов и сложных структур быстро заполняет память. В C++ все создаваемые переменные, массивы и объекты занимают место в памяти, освобождающееся только при завершении программы. Динамическая память позволяет управлять этим процессом, выделяя память по мере необходимости и освобождая её, когда она больше не нужна.

Работа с динамической памятью: пример массива

Рассмотрим создание динамического массива. Сначала создадим обычный массив:

int nums[3] = {10, 20, 30};

Этот массив занимает 12 байт (3 элемента по 4 байта на каждый). Это статическое выделение памяти. Для массива из 300 000 элементов использование динамической памяти становится крайне актуальным.

Для выделения динамической памяти используется ключевое слово new. new работает с указателями. Создадим указатель на массив:

int *nums = new int[3];

*nums объявляет указатель на целое число, new int[3] выделяет память под массив из трёх целых чисел. Обращение к элементам массива такое же, как и к элементам обычного массива:

nums[0] = 45;
std::cout << nums[0] << std::endl;

Этот код выведет значение 45, демонстрируя работу с динамическим массивом.

Очистка динамической памяти

Выделенную динамическую память необходимо освободить вручную, используя delete[]:

delete[] nums;

delete[] освобождает память, занятую динамическим массивом. Без этого оператора память остаётся занятой до завершения программы, что может привести к переполнению памяти и проблемам с производительностью, особенно при работе с большими массивами. Квадратные скобки [] указывают на очистку массива. Для обычной переменной, выделенной с помощью new, скобки не нужны:

int *var = new int;
// ... работа с var ...
delete var;

Продемонстрируем разницу:

std::cout << "LM" << nums[0] << std::endl; // Выведет 45 перед очисткой памяти
delete[] nums;
std::cout << "LM" << nums[0] << std::endl; // Неопределённое поведение после очистки

После delete[] nums попытка обращения к nums[0] приведёт к неопределённому поведению.

Динамическая память – мощный инструмент в C++, позволяющий эффективно управлять памятью, особенно при работе с большими массивами или объектами. Важно помнить об освобождении выделенной памяти с помощью delete или delete[], чтобы избежать проблем с производительностью и переполнения памяти. Использование динамической памяти для небольших переменных обычно не требуется.

Что будем искать? Например,программа