Назад к вопросам
Middle
80
questionbank

Что такое базовая гарантия безопасности в контексте стандартной библиотеки C++ и как она влияет на управление ресурсами?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Базовая гарантия безопасности (basic exception safety) означает, что при возникновении исключения программа находится в корректном, хотя и не обязательно предсказуемом, состоянии. Ресурсы, такие как динамическая память или файловые дескрипторы, которые были захвачены функцией до возникновения исключения, будут корректно освобождены.

Это достигается благодаря использованию RAII (Resource Acquisition Is Initialization) — идиомы, где владение ресурсом ассоциируется с жизненным циклом объекта. Конструктор объекта захватывает ресурс, а деструктор его освобождает. При раскрутке стека из-за исключения деструкторы объектов, созданных в текущем блоке, вызываются автоматически, гарантируя освобождение ресурсов.

#include <vector>
#include <fstream>
#include <stdexcept>

void process_data(const std::string& filename) {
    std::vector<int> data; // Вектор (динамическая память)
    std::ifstream file(filename); // Файл (ресурс)

    if (!file.is_open()) {
        throw std::runtime_error("Cannot open file"); // Исключение - файл не откроется
    }

    int value;
    while (file >> value) { // Чтение данных - может бросить исключение
        data.push_back(value); // Может бросить исключение при нехватке памяти
    }

    // Если исключение брошено до этой точки (например, при открытии файла, чтении или добавлении в vector),
    // деструкторы file (закрывает файл) и data (освобождает память) будут вызваны,
    // гарантируя базовую гарантию безопасности: файл закрыт, память освобождена,
    // но состояние data может быть неопределенным (частично заполнен).

    // Дальнейшая обработка data...
    // ...
} // Деструкторы file и data вызываются здесь, если исключение не было брошено

При базовой гарантии:

  • Все инварианты классов могут быть нарушены.
  • Данные могут быть изменены частично.
  • Ресурсы не утекают.

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