Resource management
R.12
Немедленно передавайте результат явного выделения ресурса объекту-менеджеру
Причина
Иначе исключение или возврат могут привести к утечке.
Пример (плохой)
void func(const string& name)
{
FILE* f = fopen(name, "r"); // открываем файл
vector<char> buf(1024);
auto _ = finally([f] { fclose(f); }); // не забудем закрыть файл
// ...
}
Выделение памяти для buf может завершиться неудачей и привести к утечке файлового дескриптора.
Пример
void func(const string& name)
{
ifstream f{name}; // открываем файл
vector<char> buf(1024);
// ...
}
Использование файлового дескриптора (в ifstream) простое, эффективное и безопасное.
Контроль
- Отмечать явные выделения памяти, используемые для инициализации указателей (проблема: сколько прямых выделений ресурсов мы можем распознать?)