RAII и управление ресурсами
Привяжите каждый ресурс к времени жизни объекта
- объяснить, что такое ресурс и почему возникают утечки,
- связать ресурс с объектом через конструктор и деструктор,
- применять правило трёх и правило пяти,
- использовать правило нуля с умными указателями и контейнерами.
1. Что такое ресурс и почему возникают утечки?
Ресурс — это всё, что программа берёт у системы и обязана в итоге вернуть: память из кучи через new, открытый файловый дескриптор, сетевой сокет, соединение с базой данных, блокировку мьютекса. Схема всегда одна: захватить, использовать, затем освободить. Забыли освободить — получили утечку: ресурс остаётся занятым, хотя им никто не пользуется.
Ручное освобождение кажется простым, пока реальный код не начнёт мешать:
void process() {
int* data = new int[1000]; // захват
if (!load(data)) {
return; // УТЕЧКА: на этом пути забыли delete[]
}
compute(data);
delete[] data; // освобождение (только на удачном пути)
}
Ранний return пропускает delete[]. Хуже того, если compute() бросит исключение, строка delete[] вообще не будет достигнута. Каждая ветвь, каждое исключение, каждая будущая правка — шанс на утечку. RAII убирает человека из этой цепочки.