🕵️
Введение в паттерны
  • Введение в паттерны
  • Паттерны
    • Оглавление
    • Порождающие паттерны
      • Фабричный метод
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Абстрактная фабрика
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Прототип
        • Реализации на С++
        • Реализации на Kotlin
        • Реализации на Java
        • Возможные реализации для решения конкретных задач на С++
      • Строитель
        • Реализации на С++
        • Реализации на Kotlin
      • Одиночка
        • Реализации на C++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Пул объектов
        • Реализации на С++
    • Структурные паттерны
      • Адаптер
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач
      • Декоратор
        • Реализации на С++
        • Реализации на Kotlin
      • Компоновщик
        • Реализации на С++
      • Мост
        • Реализации на С++
      • Заместитель
        • Реализации на С++
        • Реализации на Kotlin
      • Фасад
        • Реализации на С++
      • Приспособленец
        • Реализации на С++
    • Поведенческие паттерны
      • Стратегия
        • Реализации на С++
        • Реализации на Kotlin
      • Команда
        • Реализации на С++
        • Реализации на Kotlin
      • Цепочка обязанностей
        • Реализации на С++
        • Реализации на Kotlin
      • Подписчик-издатель
        • Реализации на С++
        • Реализации на Kotlin
      • Посетитель
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
      • Посредник
        • Реализации на С++
        • Реализации на Kotlin
      • Шаблонный метод
        • Реализации на С++
      • Опекун
        • Реализации на С++
      • Итератор
        • Реализации на С++
        • Реализации на Kotlin
      • Свойство
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
  • Введение в идиомы
  • Идиомы
    • Оглавление
    • RAII
    • Type erasure
      • Контейнеры с type erasure
    • CRTP
    • Статический полиморфизм
    • Shrink to fit
    • Proxy
    • Erase remove
    • Decltype (auto)
    • Copy and swap
    • Safe bool
    • Scope guard
    • Addressof
Powered by GitBook
On this page
  • Назначение
  • Решаемые задачи
  • Общая реализация на языке C++

Was this helpful?

  1. Идиомы

Scope guard

PreviousSafe boolNextAddressof

Last updated 1 year ago

Was this helpful?

Назначение

Идиома Scope-guard (область-хранитель) является подходом в программировании, который используется для автоматического освобождения ресурсов и выполнения определенных действий при выходе из области видимости (scope) в программе. Используется при:

  1. Работе с ресурсами, которые должны быть освобождены в случае исключения.

  2. Реализации обратных вызовов (например, при регистрации обработчика событий в библиотеке или фреймворке, Scope Guard может быть использован для отмены регистрации обработчика, когда он больше не нужен.).

  3. Работе с транзакциями (например, при работе с базами данных, транзакции могут быть начаты в конструкторе объекта и завершены в деструкторе. Scope Guard может быть использован для отката транзакции, если произошло исключение, но не для освобождения ресурсов, связанных с транзакцией.)

Решаемые задачи

  • Сохранение ресурсов при выходе из области видимости, если исключение не проброшено

Идиома позволяет получать ресурсы в конструкторе и высвобождать их в деструкторе, когда область заканчивается успешно или из-за исключения. Однако, иногда необходимо не высвобождать ресурсы, если исключение не выбрасывается. Идиома Scope-guard решить эту задачу и улучшить типичную реализацию идиомы RAII с помощью условной проверки.

Общая реализация на языке C++

class ScopeGuard {
public:
    ScopeGuard () : engaged_(true) 
    { 
        /* Выделение ресурсов */ 
    }
  
    ~ScopeGuard() {
        if (engaged_) 
        { 
            /* Освобождение ресурсов */ 
        }
    }

    void release()
    {
        engaged_ = false;
        /* Ресурсы больше не будут освобождаться */
    }
private:
    bool engaged_;
};
void some_init_function()
{
    ScopeGuard guard;
    // если выброситься какая-то ошибка, ресурсы будут освобождены.
    guard.release(); // Ресурсы не будут освобождены при обычном выполнении.
}
RAII