#8 – Динамический массив данных

#8 – Динамический массив данных

В C++ вам постоянно нужно следить за памятью компьютера. Один из вариантов оптимизации работы с памятью заключается в использовании динамической памяти. В уроке вы научитесь работать с ней.

Видеоурок

Динамическое выделение памяти очень удобно, так как за счёт выделения памяти мы резервируем место под данные в каком-либо объекте.


В C++ за выделение и удаление памяти отвечают операторы new и delete соответсвенно. Они служат для создания не только динамических массивов, но также для выделения памяти под объекты и даже простые переменные.

// Операция выделения памяти (new)
float *val = new float; // Можно выделять память под любые типы данных
// здесь val это указатель на участок памяти типа float 
// new служит операцией выделения этой памяти
// delete необходим для высвобождения памяти
delete val;
Динамический массив использует ту же конструкцию. Здесь также применяются операторы new и delete:
char *symbols = new char [25]; // выделение памяти под массив
// Также необходимо освободить память,
// когда массив уже не нужен
delete [] symbols;

Исходный код

Весь код будет доступен после подписки на проект!

Задание к уроку

Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям

Большое задание по курсу

Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца

Также стоит посмотреть

Игра с дизайном на C++ / Создание C++ WinForms игры
6 уроков
Уроки Qt Creator | Графический интерфейс на С++
13 уроков
Основы программирования
12 уроков
Создание игры на C++ / Создание "Змейки"
3 урока
Изучение C++ от новичка до профи
Уроки C++ WinForms / Создание программ на Windows
8 уроков
Комментарии (2)
Добавить комментарий

George 17 сентября 2023 в 17:53

#include <iostream>

int main() {

int *nums = new int[3];
nums[0] = 45;
std::cout << nums[0] << std::endl;
delete[] nums;
std::cout << "El: " << nums[0];

return 0;
}

мне после El:
выводит какие то цифры
с чем это связано?
Ответить

Анатолий 01 октября 2023 в 13:55

Естественно.... Вы обращаетесь к массиву который уже освободили... Так нельзя делать потому что этот указатель невалидный. Вы можете это посмотреть в отладчике, он изменился после delete. Могло быть хуже. Для избежани подобных ошибок лучше писать nums = nullptr; Чтобы обращение туда однозначно вызывало исключение, а не неопределённое поведение. Вы может после этого дял указателя выделить новую память например большего размера если вам надо дописать элементы, а размера не хватает. Но обычно заводят другой указатель выделяют под него память а потом перписывают старую часть в новую. Потом удаляют старый указатели и новый переписывают в старый. И у вас получится новый масив большего размера со старым содержимым вначале который можно дописать. Но обычно память под массив выделяют с запасом и хранят помимо размера ещё и ёмкость. Это то, что можно туда записать без пераллокации. Вот эта описаная выше процедура называется переаллокацией... Её стараются избегать ипроводить пореще. А вобще можно использовать не массив, а список. Это у вас надеюсь есть в курсе... В STL много всяких конейнеров. Динамический массив это vector. Там уже всё сделално как надо...

Ансар 17 июня 2023 в 14:48

Мне кажется в решении задачи "Двумерный массив" автор создал массив 2 на 2 т.к. в цикле for он поставил конечный элемент 2 (i < 2). Я сам учусь с++ но мне кажется тут ошибки. Подправьте меня если это нет так
Ответить