Ответ
RAII — фундаментальная идиома C++, которую я применяю для управления любыми ресурсами с ограниченным временем жизни. Вот ключевые примеры из моего опыта:
-
Управление файлами (
std::fstream,std::ifstream,std::ofstream): Самый наглядный пример. Файл открывается в конструкторе и гарантированно закрывается в деструкторе, даже при выбросе исключения.{ std::ofstream logFile("app.log", std::ios::app); logFile << "Application startedn"; // ... возможен throw } // logFile.~ofstream() — файл закрывается здесь автоматически -
Синхронизация потоков (
std::lock_guard,std::unique_lock,std::scoped_lock): Эти обертки захватывают мьютекс в конструкторе и освобождают в деструкторе, что исключает deadlock из-за забытогоunlock().std::mutex g_cacheMutex; void updateCache() { std::lock_guard<std::mutex> lock(g_cacheMutex); // Захват // Безопасная модификация кэша } // Автоматическое освобождение мьютекса при выходе из области видимости -
Временные измерения: Я создаю простой RAII-класс
ScopedTimer, который запоминает время начала в конструкторе и выводит продолжительность в деструкторе — очень удобно для профилирования.class ScopedTimer { std::chrono::time_point<std::chrono::high_resolution_clock> start; std::string name; public: ScopedTimer(std::string_view timerName) : name(timerName) { start = std::chrono::high_resolution_clock::now(); } ~ScopedTimer() { auto end = std::chrono::high_resolution_clock::now(); auto dur = std::chrono::duration<double, std::milli>(end - start); std::cout << name << ": " << dur.count() << " msn"; } }; -
Графические ресурсы (в обертках над OpenGL/DirectX): В своих графических проектах я создаю классы
Texture,ShaderProgram,VertexBuffer, которые загружают ресурсы в конструкторе (черезglGenTexturesи т.п.) и освобождают их в деструкторе (черезglDeleteTextures). Это делает управление GPU-памятью безопасным и исключает утечки.