Skip to content

Commit 2220be4

Browse files
committed
Add memory module
1 parent 182ae2a commit 2220be4

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

src/12_memory.cpp

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

Comments
 (0)