RAII

Resourse Acquisition Is Initialization

Альтернативные названия

  • CADR (Constructor Acquires, Destructor Releases)

  • SBRM (Scope-Bound Resourse Management)

Назначение

Resource Acquisition Is Initialization (RAII) – программная идиома, смысл которой заключается в том, чтобы с помощью тех или иных программных механизмов получение некоторого ресурса неразрывно совмещалось с инициализацией, а освобождение – с уничтожением объекта.

circle-info

C++ не имеет встроенного процесса автоматической сборки мусора. Вместо этого программа должна вручную освобождать ресурсы, чтобы избежать утечек. Современный C++ позволяет управлять ресурсами объектов, используя принцип получения ресурсов при инициализации (RAII). Это позволяет избежать утечек памяти, утечек, вызванных некорректной работой с ресурсами (файловых, сетевых, потоков, процессов, баз данных, устройств).

Решаемые задачи

  • необходимость освобождения ресурсов: например памяти или дескрипторов ресурсов

circle-info

Идиома RAII широко используется в стандартной библиотеке C++, чтобы управлять различными ресурсами, такими как память, файлы, потоки

  • гарантированное освобождение ресурсов при выходе из области видимости

  • позволяет избежать потери данных при освобождении ресурсов

Общая реализация на С++

В приведенном примере класс File использует идиому RAII для открытия файла в конструкторе и закрытия файла в деструкторе. Это гарантирует, что если возникнет исключительная ситуация, файл будет закрыт корректно, а данные не будут утеряны.

circle-info

Согласно идиоме RAII, нам следует «обернуть» файловый дескриптор в объект специального класса. Тогда открытие файла соответствовало бы инициализации объекта в его конструкторе, а закрытие файла — уничтожению объекта в деструкторе. В случае ошибки при открытии файла мы бы сгенерировали исключение, и объект нашего класса не был бы создан.

RAII в стандартной библиотеке

Некоторые примеры применения:

  • std::unique_ptr и std::shared_ptr - умные указатели, которые используют идиому RAII для автоматического освобождения памяти в деструкторе объекта.

  • std::ifstream и std::ofstream - классы, которые используют идиому RAII для автоматического закрытия файловых потоков в деструкторе объекта.

  • std::lock_guard и std::unique_lock - классы, которые используют идиому RAII для автоматического освобождения блокировок при выходе из области видимости объекта.

  • std::thread - класс, который использует идиому RAII для автоматического завершения потока при выходе из области видимости объекта.

circle-info

Использование RAII в стандартной библиотеке C++ позволяет создавать более безопасный и понятный код, а также уменьшить количество ошибок и утечек памяти.

Last updated