Sobes.tech
Middle+

Mida te teate erandite turvaseadist?

sobes.tech AI

Vastus AI-lt

Turvalisuse garantiid määravad funktsiooni käitumise erandite tekkimisel. On neli garantiide taset:

  1. 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:
    } 
    
  2. 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
    }
    
  3. 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;
    }
    
  4. 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