-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy path13_dynamic_array.cpp
More file actions
58 lines (41 loc) · 2.34 KB
/
13_dynamic_array.cpp
File metadata and controls
58 lines (41 loc) · 2.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream> // cout
#include <algorithm> // copy
int main() {
// 1. Динамический массив.
// В отличие от статического массива, динамическое выделение памяти позволяет
// устанавливать длину массива во время выполнения программы (runtime).
{
int length = 3; // размер массива может быть получен из файла, сети и т.д.
// Что здесь происходи?
// 1. Выделяем участок памяти под массив размера length.
// 2. Сохраняем адрес в указателе.
int* arr = new int[length]{}; // все элементы нули
// Доступ к элементам осуществляется через оператор [].
arr[0] = 1;
// высвобождаем выделенную память при помощи оператора delete[] (для массивов)
delete[] arr;
// выделили другой участок памяти размером 2 * length и сохранили адрес в указателе
arr = new int[2 * length]{};
delete[] arr; // зачем мы еще раз высвобождаем память?
}
// Use-case: увеличение размера массива с копированием старых данных.
{
// исходный массив
int* arr = new int[3]{0, 1, 2}; // [0, 1, 2]
// расширенный массив, неинициализированный
int* arr_resized = new int[5]; // [x, x, x, x, x]
// копируем данные
std::copy(arr, arr + 3, arr_resized); // [0, 1, 2, x, x]
// высвобождаем память, занимаемую исходным массивом
delete[] arr;
// указатель ссылаем на участок памяти расширенного массива
arr = arr_resized; // эквивалентно: arr = &arr_resized[0]
for (int i = 0; i < 5; i++) {
std::cout << arr[i] << ' ';
}
std::cout << '\n';
// не забываем высвободить участок памяти, на который ссылается указатель
delete[] arr;
}
return 0;
}