Войти
ПрограммированиеТермины

Resource Acquisition Is Initialization (Получение ресурса есть инициализация)

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

Получение доступа к ресурсу происходит в конструкторе, а освобождение в деструкторе. Поскольку деструктор автоматической переменной вызывается при выходе из её области видимости, то можно гарантировать освобождение ресурса, как только жизненный цикл переменной подойдет к концу. Это также справедливо в ситуациях, в которых возникают исключения. Это делает RAII ключевой концепцией для написания exception-safe кода:

class file_resource {
public:
    file_resource(FILE *file)
    { 
        file_ = file;
    }

    ~file_resource();
    {
        fclose(file_);
    }

protected:
    FILE *file_;
};

Этот простой класс RAII можно использовать примерно так:

bool fun()
{
    // выделяем ресурс: открываем файл
    FILE *handle = fopen("myfile.txt", "r");
    if ( !handle ) return false;

    file_resource file(handle);
    // теперь ресурс будет освобождён в любом случае,
    // неважно, произойдёт ли нормальный выход из блока или исключение

    // ...
    // работаем с ресурсом
    // ...

    return true;
    // здесь вызывается деструктор file и освобождает ресурсы (в данном случае, закрывает открытый файл)
}

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

Важный случай использования RAII — умные указатели: классы, инкапсулирующие владение памятью.

Что такое Resource Acquisition Is Initialization (Получение ресурса есть инициализация)?

9 октября 2005 (Обновление: 15 окт. 2005)