Перейти к содержимому

C++: Стек вызовов, динамическая память и ошибки | Лекция 5 | ИТМО, ФИТИП

Sergei Fadeev

0:00 / 0:00

C++: Стек вызовов, динамическая память и ошибки | Лекция 5 | ИТМО, ФИТИП

214 просмотров · 15 ч назад
Sergei Fadeev
182 подписчика
214 просмотров · 15 ч назад
Курс C++ для студентов 1-го курса факультета информационных технологий и программирования (ФИТИП) Университета ИТМО. Продолжаем разбирать память работающей программы. Начали со стека вызовов: как функция получает аргументы и возвращает результат через регистры процессора, что означают названия RAX, RSP и RBP и что происходит на стеке при вызове функции — инструкция за инструкцией. Затем обсудили, сколько живут объекты в C++: автоматическое, статическое, потоковое и динамическое время хранения, и чем локальная static-переменная отличается от обычной. Во второй части перешли к куче. Разобрали, как объект переживает функцию, которая его создала, как работают malloc, calloc, realloc и free, чем от них отличаются new и delete и почему их нельзя смешивать. Познакомились с placement new — созданием объекта в уже выделенной памяти. Напоследок разобрали типичные ошибки работы с памятью: выход за границы массива, обращение к освобождённой памяти, повторное освобождение, разыменование nullptr и утечки. Научились ловить их санитайзерами AddressSanitizer и UndefinedBehaviorSanitizer. А ещё выяснили, почему функция может пользоваться памятью, которую ей никто не выделял, почему куча — это совсем не куча и почему упавшая программа — ещё не худший исход.