Mida te teate erandite turvaseadist?
sobes.tech AI
Vastus AI-lt
Turvalisuse garantiid määravad funktsiooni käitumise erandite tekkimisel. On neli garantiide taset:
-
Põhigarantii (Basic guarantee): Kui funktsioon viskab erandi, jääb programm kehtivasse olekusse. Ressursid ei kao (näiteks mälu vabastatakse), kuid objektide täpne seisund võib olla teadmata. Võimalik on jätkata tööd:
// Põhigarantii näide void basic_guarantee_function(std::vector<int>& vec, int value) { // Võib tekkida erand sisestamisel vec.push_back(value); // Kui erand tekib, võib vec olla ettearvamatus seisundis (osaliselt muudetud), // kuid vec jaoks eraldatud mälu vabastatakse õigesti väljundi ajal: } -
Range garantii (Strong guarantee): Kui funktsioon viskab erandi, jääb programmi seisund samaks nagu enne välcalli. Kõik muudatused tühistatakse:
// Range garantii näide // Kasutame Copy-and-Swap meetodit garantii tagamiseks class Resource { int* data; size_t size; public: Resource(size_t s) : size(s), data(new int[s]) {} ~Resource() { delete[] data; } Resource(const Resource& other) : size(other.size), data(new int[other.size]) { std::copy(other.data, other.data + size, data); // Võib tekkida erand } Resource& operator=(Resource other) // Väärtuse üleandmine loob koopiat { swap(*this, other); // Ei põhjusta erandeid return *this; } friend void swap(Resource& first, Resource& second) noexcept { using std::swap; swap(first.data, second.data); swap(first.size, second.size); } // ... teised liikmed }; void strong_guarantee_function(Resource& res, size_t new_size) { Resource temp(new_size); // Kui siin tekib erand, res ei muutu res = temp; // Kasutame ülekoormatud = operaatorit, mis tagab range garantii } -
Erandite puudumise garantii (No-throw guarantee): Funktsioon ei viska kunagi erandit. Sellised funktsioonid märgitakse
noexcept-iga:// Erandite puudumise näide void no_throw_function() noexcept { // Ei ole operatsioone, mis võiksid erandi visata int a = 5; int b = 10; int c = a + b; } -
Vead garantii (Failure guarantee): Erandite turvalisuse kontekstis tähendab see, et funktsioon võib jätta programmi määramatusse olekusse, võib olla ressursside lekkimine või vigu. See on tegelikult garantii puudumine. Sellisest käitumisest tuleks hoiduda:
Erandite turvalisuse garantii tähtsus seisneb usaldusväärse ja prognoositava koodi loomises, mis korrektselt käsitleb vigu ja haldab ressursse isegi erandite korral. Valitud garantii tase sõltub operatsiooni kriitilisusest, taastamise maksumusest ja erandi tekkimise tõenäosusest:
Võrdlustabel garantii tasemetest:
| Garantii | Seisund erandi korral | Andmete terviklikkus | Ressursside lekkimine |
|---|---|---|---|
| Põhigarantii | Kehtiv, kuid määramatu | Ei tagata | Ei |
| Range garantii | Muutumatuna (nagu enne) | Säilitatakse | Ei |
| Erandite puudumine | Ei toimu kunagi (erandeid pole) | N/A | N/A |
| Vea garantii | Määramatu, võimalik kahjustus või vead | Ei tagata | Võimalik |