Урок 24: Безопасность памяти — утечки и висячие указатели
Мы научились запрашивать память — теперь научимся не обжигаться об неё. Утечка памяти происходит, когда вы теряете последний указатель на блок, не освободив его, например присваивая p новый адрес до free. Двойное освобождение (double free) — это неопределённое поведение, а использование указателя по
Представьте ключи от ячеек хранения: утечка — это потеря единственного ключа от занятой ячейки, и ячейка занята навсегда. Двойное освобождение — это попытка вернуть один и тот же ключ дважды, и на ресепшене начинается паника. Висячий указатель — это использование копии ключа от ячейки, которую вы уже сдали: кто знает, что (или кто) там теперь.
- утечка памяти
- Потеря последнего указателя на выделенный блок без вызова free — память остаётся занятой, и её невозможно освободить.
- двойное освобождение (double free)
- Вызов free дважды для одного и того же блока. Неопределённое поведение — сбой или повреждение памяти.
- висячий указатель (dangling)
- Указатель, который всё ещё хранит адрес освобождённого блока. Его использование (use-after-free) — неопределённое поведение.
- владение (ownership)
- Защитный образ мышления: у каждого блока есть один «владелец», отвечающий за его освобождение — ровно один раз. Всегда спрашивайте «кто отвечает за освобождение этого?».
- valgrind
- Инструмент, который запускает вашу программу и находит утечки и ошибки работы с памятью: valgrind ./prog.