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 и т.п.)