Skip to content

Commit 0b62d71

Browse files
committed
Add dynamic array module
1 parent 545f112 commit 0b62d71

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed

src/13_dynamic_array.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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

Comments
 (0)