Что такое базовая гарантия безопасности в контексте стандартной библиотеки 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 вызываются здесь, если исключение не было брошено
При базовой гарантии:
- Все инварианты классов могут быть нарушены.
- Данные могут быть изменены частично.
- Ресурсы не утекают.
Это слабее сильной гарантии (состояние программы не меняется при исключении) и нет гарантии (состояние программы не определено, возможны утечки). В стандартной библиотеке многие операции предоставляют базовую гарантию, что является минимальным требованием для корректной работы с исключениями.