Co je základní záruka bezpečnosti v kontextu standardní knihovny C++ a jak ovlivňuje správu zdrojů?
sobes.tech AI
Odpověď od AI
Základní záruka bezpečnosti (základní úroveň bezpečnosti výjimek) znamená, že při výskytu výjimky je program ve správném, i když ne nutně předvídatelném stavu. Zdroje, jako je dynamická paměť nebo deskriptory souborů, které byly získány funkcí před výskytem výjimky, budou správně uvolněny.
Toho je dosaženo použitím RAII (Resource Acquisition Is Initialization) — idiomu, kde je vlastnictví zdroje spojeno s životním cyklem objektu. Konstruktor objektu získá zdroj, a destruktor jej uvolní. Při rozbalení zásobníku kvůli výjimce jsou automaticky volány destruktory objektů vytvořených v aktuálním bloku, což zajišťuje uvolnění zdrojů.
#include <vector>
#include <fstream>
#include <stdexcept>
void process_data(const std::string& filename) {
std::vector<int> data; // Vektor (dynamická paměť)
std::ifstream file(filename); // Zdroj: soubor
if (!file.is_open()) {
throw std::runtime_error("Nelze otevřít soubor"); // Výjimka - soubor se neotevře
}
int value;
while (file >> value) { // Čtení dat - může vyvolat výjimku
data.push_back(value); // Může vyvolat výjimku při nedostatku paměti
}
// Pokud je výjimka vyvolána před tímto bodem (například při otevírání souboru, čtení nebo přidávání do vektoru),
// destruktory file (který zavře soubor) a data (které uvolní paměť) jsou volány automaticky,
// zajišťující základní záruku bezpečnosti: soubor je uzavřen, paměť je uvolněna,
// ale stav data může být neurčitý (částečně naplněn).
// Další zpracování data...
// ...
} // Destruktory file a data jsou volány zde, pokud výjimka nebyla vyvolána
Se základní zárukou:
- Všechny invariants tříd mohou být porušeny.
- Data mohou být částečně změněna.
- Zdroje nezmizí.
Toto je slabší než silná záruka (stav programu se při výjimce nemění) a není žádná záruka (stav programu je neurčitý, mohou nastat úniky). V standardní knihovně mnoho operací poskytuje základní záruku, což je minimální požadavek pro správnou práci s výjimkami.