RAII

RAII (Resource Acquisition Is Initialization, «получение ресурса есть инициализация») — это ключевая идиома в C++, которая связывает время жизни ресурса (память, файлы, мьютексы и т. д.) с временем жизни объекта.

Основная идея заключается в захвате ресурса при конструировании объекта и автоматическом освобождении ресурса в деструкторе.

Типичный пример применения RAII - умные указатели.

Неправильно:

void foo() {
    std::FILE* file = fopen("data.txt", "r");
    if (some_error) {
        return; // Утечка! Файл не закрыт.
    }
    fclose(file); // Досюда может не дойти
}

Правильно:

void foo() {
    auto file = std::unique_ptr(
        std::fopen("data.txt", "r"),
        [](std::FILE* f) { if (f) std::fclose(f); }
    );
    if (some_error) {
        return;
    }
} // Утечки нет, файл закрыт

Или можно создать свой класс-обертку:

void foo() {
    File file("data.txt"); // Ресурс управляется объектом
    if (some_error) {
        return; // Файл закроется в деструкторе File
    }
} // Деструктор File вызовет fclose()

Примечание: на самом деле, для работы с файлами не нужно использоввать FILE, так как в C++ для этого есть различные файловые потоки (std::ifstream и т.п.)