Получение ресурса есть инициализация
Материал из Википедии — свободной энциклопедии
Получение ресурса есть инициализация (англ. Resource Acquisition Is Initialization (RAII)) — концепция объектно-ориентированного программирования, которого заключается в том, что получение ресурса совмещается с инициализацией, а освобождение с деинициализацией (уничтожением) переменной.
Получение доступа к ресурсу происходит в конструкторе, а освобождение в деструкторе. Поскольку деструктор автоматической переменной вызывается при выходе из её области видимости, то освобождение ресурс гарантировано освобождается при уничтожении переменной. Это справедливо и в ситуациях, в которых возникают исключения. Это делает RAII ключевой концепцией для написания безопасного при искючениях кода.
[править] Применения
Концепция может использоваться для любых разделяемых объектов или ресурсов:
- для выделения памяти,
- для открытия файлов или устройств,
- для мьютексов или критических секций и т. д.
Важный случай использования RAII — «умные указатели»: классы, инкапсулирующие владение памятью.
[править] Пример
Пример класса, реализующего захват ресурсов при инициализации, на языке C++:
class LogFile { public : LogFile(const char* fileName): m_file(OpenFile(fileName)) // инициализация члена описателем файла { if( m_file == INVALID_HANDLE ) throw FileFailedToOpen(); } // ~LogFile() { CloseFile(m_file); } // закрытие файла в деструкторе void write(const char* logLine) { WriteFile( m_file, logLine ); } private : FILE_HANDLE m_file; // для запрета копирования копирующий конструктор и оператор присваивания закрыты LogFile (const LogFile&); LogFile& operator= (const LogFile&); };
Использование вышеприведённого класса:
bool functionA() { LogFile log("Output log of functionA"); log.write("fun Step5 succeeded"); // независимо от того будет исключение или нормальный возврат // файл будет закрыт if( ... ) throw FunctionAFailure(); return true; }