1
+ #include < iostream>
2
+
3
+ int main () { // область видимости функции
4
+
5
+ // 1. Автоматическое управление памятью на стеке.
6
+
7
+ // До этого момента мы работали с автоматическим выделением и освобождением памяти.
8
+ // Автоматическое управление памятью производится в рамках областей видимости (scopes).
9
+
10
+ { // область видимости
11
+
12
+ // Автоматически выделяется память под переменные.
13
+ int var = 0 ;
14
+ int arr[2 ] = {};
15
+
16
+ } // область видимости закрылась
17
+
18
+ // Здесь, у нас уже нет переменной 'var' и массива 'arr'.
19
+ // Участки памяти, выделенные под переменные, свободны и могут быть повторно использованы.
20
+
21
+ {
22
+ // Память выделяется из специального резервуара - стека.
23
+ // Стек имеет довольно ограниченный размер - что будет, если раскомментировать код ниже?
24
+
25
+ // int arr[1000000];
26
+ }
27
+
28
+ // 2. Ручное управление памятью на куче (heap).
29
+
30
+ // Проблема нехватки памяти на стеке решается при помощи динамической памяти.
31
+ // Динамическое выделение памяти - способ запроса памяти из ОС.
32
+ // Память выделяется из объемного резервуара - кучи (heap).
33
+
34
+ {
35
+ // Запросим выделение памяти для хранения целочисленного типа int.
36
+ // Оператор new возвращает указатель, который содержит адрес выделенной памяти.
37
+ int *pointer = new int ; // по адресу хранится "мусор"
38
+
39
+ *pointer = 1 ; // устанавливаем значение участка памяти по указателю
40
+
41
+ // При выходе из области видимости указатель автоматически "удалится" из памяти.
42
+ // НО, участок памяти, на который ссылается указатель - НЕТ.
43
+
44
+ delete pointer; // вручную высвобождаем выделенную память
45
+ pointer = nullptr ; // "обнуление указателя", является хорошей практикой
46
+
47
+ // Рубрика "что будет, если":
48
+ // - повторно высвободим участок памяти, на который ссылает pointer
49
+ // - не обнулить указатель после высвобождения памяти
50
+ }
51
+
52
+ // 3. Утечка памяти.
53
+
54
+ {
55
+ // выделение памяти под int, инициализация значением 0, сохранение адреса в указатель
56
+ int * pointer = new int {0 };
57
+
58
+ // ой, забыли высвободить память...
59
+ }
60
+
61
+ // Что произошло?
62
+ // 1. Программа зарезервировала у ОС участок памяти и не высвободила его.
63
+ // 2. ОС думает, что этот участок памяти занят и не трогает его.
64
+ // 3. Участок памяти высвободится только при завершении программы.
65
+
66
+ return 0 ;
67
+ }
68
+
69
+ /*
70
+ * Задания:
71
+ * 1. Что занимается автоматическим выделением памяти: ОС, компилятор?
72
+ * 2. Чем страшна утечка памяти? Приведите примеры.
73
+ * 3. Управляют ли вручную памятью в современном C++?
74
+ */
0 commit comments