Перейти к содержанию

RAII и управление ресурсами

Начало урока

RAII и управление ресурсами

Привяжите каждый ресурс к времени жизни объекта

Главная идея: RAII расшифровывается как Resource Acquisition Is Initialization — «захват ресурса есть инициализация». Название неуклюжее, но идея изящна: как только объект захватывает ресурс (память, файл, блокировку, сокет), он захватывает его в конструкторе и отдаёт обратно в деструкторе. Поскольку C++ гарантирует запуск деструктора при выходе объекта из области видимости, освобождение становится автоматическим и безопасным при исключениях.
К концу урока вы сможете:
  • объяснить, что такое ресурс и почему возникают утечки,
  • связать ресурс с объектом через конструктор и деструктор,
  • применять правило трёх и правило пяти,
  • использовать правило нуля с умными указателями и контейнерами.

1. Что такое ресурс и почему возникают утечки?

Ресурс — это всё, что программа берёт у системы и обязана в итоге вернуть: память из кучи через new, открытый файловый дескриптор, сетевой сокет, соединение с базой данных, блокировку мьютекса. Схема всегда одна: захватить, использовать, затем освободить. Забыли освободить — получили утечку: ресурс остаётся занятым, хотя им никто не пользуется.

Ручное освобождение кажется простым, пока реальный код не начнёт мешать:

void process() {
    int* data = new int[1000];   // захват
    if (!load(data)) {
        return;                  // УТЕЧКА: на этом пути забыли delete[]
    }
    compute(data);
    delete[] data;               // освобождение (только на удачном пути)
}

Ранний return пропускает delete[]. Хуже того, если compute() бросит исключение, строка delete[] вообще не будет достигнута. Каждая ветвь, каждое исключение, каждая будущая правка — шанс на утечку. RAII убирает человека из этой цепочки.

Ключевая мысль: освобождение не должно быть инструкцией, которую нужно не забыть написать; оно должно быть следствием разрушения объекта.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя