Динамическая память в 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[], чтобы избежать проблем с производительностью и переполнения памяти. Использование динамической памяти для небольших переменных обычно не требуется.