Čo je základná záruka bezpečnosti v kontexte štandardnej knižnice C++ a ako ovplyvňuje správu zdrojov?
sobes.tech AI
Odpoveď od AI
Základná záruka bezpečnosti (základná výnimková bezpečnosť) znamená, že pri výskyte výnimky je program v správnom, hoci nie nevyhnutne predvídateľnom stave. Zdroje, ako dynamická pamäť alebo súbory, ktoré boli získané funkciou pred výskytom výnimky, budú správne uvoľnené.
Toto sa dosahuje pomocou RAII (Resource Acquisition Is Initialization) — idiomu, kde vlastníctvo zdroja je spojené s životným cyklom objektu. Konštruktor objektu získava zdroj a deštruktor ho uvoľňuje. Pri odvíjaní zásobníka kvôli výnimke sa automaticky volajú deštruktory objektov vytvorených v aktuálnom bloku, čím sa zabezpečuje uvoľnenie zdrojov.
#include <vector>
#include <fstream>
#include <stdexcept>
void process_data(const std::string& filename) {
std::vector<int> data; // Vektor (dynamická pamäť)
std::ifstream file(filename); // Súbor (zdroj)
if (!file.is_open()) {
throw std::runtime_error("Cannot open file"); // Výnimka - súbor sa neotvorí
}
int value;
while (file >> value) { // Čítanie dát - môže vyhodiť výnimku
data.push_back(value); // Môže vyhodiť výnimku pri nedostatku pamäti
}
// Ak je výnimka vyhodená do tohto bodu (napríklad pri otváraní súboru, čítaní alebo pridávaní do vector),
// deštruktory file (zatvára súbor) a data (uvoľňuje pamäť) budú volané,
// zabezpečujúc základnú záruku bezpečnosti: súbor je zatvorený, pamäť je uvoľnená,
// ale stav data môže byť neurčitý (čiastočne naplnený).
// Ďalšie spracovanie data...
// ...
} // Deštruktory file a data sú volané tu, ak výnimka nebola vyhodená
Pri základnej záruke:
- Všetky invarianty tried môžu byť narušené.
- Dáta môžu byť čiastočne zmenené.
- Zdroje neunikajú.
Toto je slabšie ako silná záruka (stav programu sa nemení pri výnimke) a nemá žiadnu záruku (stav programu je neurčitý, môžu nastať úniky). V štandardnej knižnici mnoho operácií poskytuje základnú záruku, čo je minimálna požiadavka pre správnu prácu s výnimkami.