← Назад ко всем вопросам

Какие знаешь гарантии безопасности исключений

1️⃣ Как кратко ответить

Гарантии безопасности исключений в C++ включают три уровня: базовая гарантия, строгая (или сильная) гарантия и гарантия отсутствия исключений. Базовая гарантия обеспечивает сохранение инвариантов и отсутствие утечек ресурсов. Строгая гарантия гарантирует, что в случае исключения состояние программы не изменится. Гарантия отсутствия исключений обещает, что функция не выбросит исключений.

2️⃣ Подробное объяснение темы

В C++ исключения используются для обработки ошибок и необычных ситуаций. Гарантии безопасности исключений определяют, как программа должна себя вести, если в процессе выполнения выбрасывается исключение. Это важно для обеспечения надежности и предсказуемости кода. Рассмотрим три основных уровня гарантий безопасности исключений:

  1. Базовая гарантия (Basic Guarantee):

    Базовая гарантия обещает, что если исключение выбрасывается, то программа не утратит инварианты и не произойдет утечек ресурсов. Это минимальная гарантия, которую должны предоставлять все функции. Например, если функция выделяет память, то в случае исключения эта память должна быть корректно освобождена.

    void exampleFunction() {
        std::vector<int> vec;
        vec.push_back(1); // Если здесь выбрасывается исключение, вектор остается в валидном состоянии
    }
    

    В этом примере, если push_back выбросит исключение, вектор vec останется в корректном состоянии, и не произойдет утечек памяти.

  2. Строгая гарантия (Strong Guarantee):

    Строгая гарантия обеспечивает, что если функция выбрасывает исключение, состояние программы остается неизменным. Это означает, что либо операция завершается успешно, либо программа возвращается к состоянию, в котором она была до вызова функции.

    std::vector<int> vec = {1, 2, 3};
    ​
    void addElement(std::vector<int>& v, int element) {
        std::vector<int> temp = v; // Создаем копию вектора
        temp.push_back(element);   // Выполняем операцию на копии
        v = temp;                  // Если все прошло успешно, обновляем оригинал
    }
    

    В этом примере, если push_back выбросит исключение, оригинальный вектор vec останется неизменным, так как операция выполняется на временной копии.

  3. Гарантия отсутствия исключений (No-Throw Guarantee):

    Гарантия отсутствия исключений обещает, что функция не выбросит исключений. Это самая сильная гарантия и обычно применяется к деструкторам и функциям, которые должны быть безопасными в любых условиях.

    void safeFunction() noexcept {
        // Код, который гарантированно не выбросит исключений
    }
    

    Использование спецификатора noexcept указывает, что функция safeFunction не выбросит исключений. Это важно для функций, которые вызываются в критических секциях или в деструкторах, где выброс исключения может привести к завершению программы.

Гарантии безопасности исключений помогают разработчикам писать более надежный и предсказуемый код, особенно в сложных системах, где ошибки могут иметь серьезные последствия. Понимание и правильное применение этих гарантий позволяет минимизировать риск возникновения ошибок и утечек ресурсов.

Тема: Исключения / noexcept / Safety
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки