Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy
Контакт для рекламы: @sendme_ads
Post #2558
158
🤔 Строгая гарантия безопасности
Гарантии безопасности исключений в C++ делятся на три уровня:
Базовая гарантия (Basic Guarantee) – программа не падает, но объект может остаться в некорректном состоянии.
Строгая гарантия (Strong Guarantee) – либо операция завершается успешно, либо объект остаётся в том же состоянии, что и до вызова.
Гарантия отсутствия исключений (No-Throw Guarantee) – операция никогда не бросает исключений.
🚩Что такое строгая гарантия безопасности исключений?
Строгая гарантия (Strong Guarantee) означает, что если во время выполнения операции выбрасывается исключение, объект остаётся неизменным. Это похоже на транзакции в базе данных – "всё или ничего".
🚩Как реализовать строгую гарантию?
Чтобы добиться строгой гарантии, используем Copy & Swap:
1. Создаём временный объект.
2. Выполняем изменения на временном объекте.
3. Если всё прошло успешно – меняем указатель (swap).
🚩Где используется строгая гарантия?
Операции присваивания (
Методы стандартных контейнеров (
Функции стандартной библиотеки (
Изменения объектов с ресурсами (файлы, сокеты, память)
Ставь 👍 и забирай 📚 Базу знаний
Гарантии безопасности исключений в C++ делятся на три уровня:
Базовая гарантия (Basic Guarantee) – программа не падает, но объект может остаться в некорректном состоянии.
Строгая гарантия (Strong Guarantee) – либо операция завершается успешно, либо объект остаётся в том же состоянии, что и до вызова.
Гарантия отсутствия исключений (No-Throw Guarantee) – операция никогда не бросает исключений.
🚩Что такое строгая гарантия безопасности исключений?
Строгая гарантия (Strong Guarantee) означает, что если во время выполнения операции выбрасывается исключение, объект остаётся неизменным. Это похоже на транзакции в базе данных – "всё или ничего".
#include <iostream>
#include <vector>
class BadContainer {
std::vector<int> data;
public:
void add(int value) {
data.push_back(value); // push_back() может выбросить исключение
}
void print() {
for (int x : data) std::cout << x << " ";
std::cout << std::endl;
}
};
int main() {
BadContainer c;
c.add(1);
c.add(2);
c.add(3);
c.print(); // Вывод: 1 2 3
try {
c.add(42); // Может выбросить исключение (например, нехватка памяти)
} catch (...) {
std::cout << "Ошибка!\n";
}
c.print(); // ❌ Возможно, состояние испорчено!
}
🚩Как реализовать строгую гарантию?
Чтобы добиться строгой гарантии, используем Copy & Swap:
1. Создаём временный объект.
2. Выполняем изменения на временном объекте.
3. Если всё прошло успешно – меняем указатель (swap).
#include <iostream>
#include <vector>
class SafeContainer {
std::vector<int> data;
public:
void add(int value) {
std::vector<int> temp = data; // Создаём копию текущего состояния
temp.push_back(value); // Добавляем элемент в копию
std::swap(data, temp); // Если исключения не было, меняем данные
}
void print() {
for (int x : data) std::cout << x << " ";
std::cout << std::endl;
}
};
int main() {
SafeContainer c;
c.add(1);
c.add(2);
c.add(3);
c.print(); // Вывод: 1 2 3
try {
c.add(42); // Если тут исключение, объект не изменится
} catch (...) {
std::cout << "Ошибка!\n";
}
c.print(); // ✅ Вывод: 1 2 3 (не испорчен!)
}
🚩Где используется строгая гарантия?
Операции присваивания (
operator=) с Copy & Swap Методы стандартных контейнеров (
std::vector::resize, std::map::insert) Функции стандартной библиотеки (
std::sort) Изменения объектов с ресурсами (файлы, сокеты, память)
Ставь 👍 и забирай 📚 Базу знаний
