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