Похожие презентации:
Динамические объекты
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