242.14K
Категория: ИнформатикаИнформатика

Динамические объекты

1.

Динамические объекты

2.

Динамические объекты.
• Изначально ОС (операционная система) выделяет определенное количество памяти
для нашей программы. При создании локальных переменных или параметров
функции, память для них выделяется при входе в блок кода, в котором они находятся,
и удаляются при выходе из него. Все это происходит автоматически, без нашего
участия.
• Но мы также можем попросить дополнительную память у ОС динамически – т.е. на
этапе выполнения программы. В динамической памяти размещаются динамические
объекты
Динамические объекты – продолжительность их жизни не зависит от того, где они
созданы, они существуют до тех пор, пока не будут удалены явным образом.
• Для управления динамическими объектами применяются операторы new и delete
2

3.

Оператор new
Оператор new выделяет место в динамической памяти для объекта и возвращает
указатель на этот объект
P/S Понятно, что для обычной целочисленной переменной мы не будем запрашивать
память, это не имеет никакого смысла, это нужно для каких-то больших массивов
данных
3

4.

Оператор delete
Динамические объекты существуют пока не будут явным образом удалены. После
завершения использования динамического объекта следует освободить память с
помощью оператора delete
Оператор delete получает указатель на динамический объект и удаляет его из
памяти. Т.е. память выделенная ранее оператором new освобождается
Оператор delete удаляет объект по адресу, на который указывает указатель, но сам
указатель по прежнему будет указывать на ту область памяти, но т.к. там уже нет
никакого объекта, то и получить значение или положить что-то туда через оператор
разыменования не получится, будет ошибка.
4

5.

Утечка памяти
В С++ нет автоматического сборщика мусора, а значит, ответственность за очистку
памяти лежит на программисте. Если этим пренебречь есть риск, что память вся
израсходуется и программа аварийно завершит свое выполнение. И уже после
завершения выполнения нашей программы, ОС очистит все данные из памяти,
которые там остались во время выполнения нашей программы.
5

6.

Динамические массивы
Code: Выделение памяти также используется оператор new
Code: Удаление динамического массива:
6

7.

Динамические массивы
Размер обычного массива всегда должен быть константой, т.е. это не может быть
вычисляемым значением или введенным с консоли. А вот размер динамического
массива может быть вычислен прямо по ходу программы, или введен с консоли:
7

8.

Изменение размера существующего массива
После выделения памяти для массива, в него больше нельзя добавить элемент или
удалить элемент из него. Для того чтобы добавить новый элемент, фактически нужно
создать новый массив размером на 1 больше чем старый, скопировать в него все
элементы старого массива и добавить новый элемент в конец.
Code: Написать функцию AddElement для добавления элемент в конец массива
8

9.

Решение
Code:
9

10.

Разбор
Размер массива изменить нельзя, а значит не получится добавить в него новый
элемент. Единственное решение, это создать новый массив размером больше, затем
скопировать туда все элементы из старого массива и добавить новый элемент.
1) Первым делом создается новый массив размером больше, и в него копируются все
элементы старого массива:
2) В конец нового массива добавляется новый элемент:
10

11.

Разбор
3) Размер массива изменился, значит его нужно изменить // т.к. он передается по
ссылке, но измененный размер будет и в функции «main»
4) Остается только очистить память, которую занимал старый массив и присвоить
переданному в функцию указателю адрес нового массива // т.к. указатель передается
по ссылке, то в функции «main» указатель будет указывать на новый массив
P/S Все будет работать даже если не удалять старый массив из памяти, но по хорошему
это нужно делать, иначе память расходуется напрасно, так как к этому участку памяти
уже нельзя никак обратиться. А если постоянно «забывать» очищать память, то это
прямая дорога к утечке памяти.
11

12.

Задание
Задание 1: Написать функцию AddRange, которая будет вставлять
новый элемент в конец массива в определенном количестве.
Пример:
numbers = { 1, 2, 3, 4, 5 }
value = 777; amount = 3
numbers = { 1, 2, 3, 4, 5, 777, 777, 777 }
12

13.

Задание
Задание 2: Написать функцию RemoveElement, который будет
удалять последний элемент массива.
Пример:
numbers = { 1, 2, 3, 4, 5 }
numbers = { 1, 2, 3, 4 }
13

14.

Задание
Задание 3: Написать функцию RemoveAt, который будет удалять
элемент массива под конкретным индексом.
Пример:
numbers = { 1, 2, 3, 4, 5 }
index = 2
numbers = { 1, 2, 4, 5 }
14
English     Русский Правила