Sobes.tech
Middle

Ce este garanția de bază a securității în contextul bibliotecii standard C++ și cum influențează gestionarea resurselor?

sobes.tech AI

Răspuns de la AI

Garanția de bază a securității (nivelul de siguranță de bază în caz de excepție) înseamnă că, în cazul apariției unei excepții, programul se află într-o stare corectă, deși nu neapărat previzibilă. Resursele, cum ar fi memoria dinamică sau descriptorii de fișiere, care au fost achiziționate de funcție înainte de apariția excepției, vor fi eliberate corect.

Acest lucru se realizează prin utilizarea RAII (Resource Acquisition Is Initialization) — o idiomă în care deținerea unei resurse este asociată cu ciclul de viață al obiectului. Constructorul obiectului achiziționează resursa, iar destructorul o eliberează. Când stiva se desfășoară din cauza unei excepții, destructorii obiectelor create în blocul curent sunt apelați automat, garantând eliberarea resurselor.

#include <vector>
#include <fstream>
#include <stdexcept>

void process_data(const std::string& filename) {
    std::vector<int> data; // Vector (memorie dinamică)
    std::ifstream file(filename); // Resursă: fișier

    if (!file.is_open()) {
        throw std::runtime_error("Nu se poate deschide fișierul"); // Excepție - fișierul nu se va deschide
    }

    int value;
    while (file >> value) { // Citirea datelor - poate arunca excepție
        data.push_back(value); // Poate arunca excepție în cazul lipsei de memorie
    }

    // Dacă excepția este aruncată înainte de acest punct (de exemplu, la deschiderea fișierului, citire sau adăugare în vector),
    // destructorii lui file (care închide fișierul) și ai lui data (care eliberează memoria) vor fi apelați,
    // garantând garanția de bază a siguranței: fișierul este închis, memoria este eliberată,
    // dar starea lui data poate fi indefinită (parțial umplută).

    // Procesare suplimentară a lui data...
    // ...
} // Destructorii lui file și data sunt apelați aici dacă excepția nu a fost aruncată

Cu garanția de bază:

  • Toate invariabilele claselor pot fi încălcate.
  • Datele pot fi modificate parțial.
  • Resursele nu se pierd.

Aceasta este mai slabă decât garanția puternică (starea programului nu se schimbă în caz de excepție) și nu există garanție (starea programului este nedefinită, pot apărea scurgeri). În biblioteca standard, multe operații oferă garanția de bază, care reprezintă cerința minimă pentru funcționarea corectă cu excepțiile.