Sobes.tech
Middle

C++ standart kitabxanasının kontekstində əsas təhlükəsizlik zəmanəti nədir və bu, resursların idarə olunmasına necə təsir edir?

sobes.tech Süni İntellekt

AI-dan cavab

Əsas təhlükəsizlik zəmanəti (əsas istisna təhlükəsizliyi) istisna baş verdikdə proqramın düzgün, lakin mütləq proqnozlaşdırıla bilməyən vəziyyətdə olduğunu göstərir. Resurslar, məsələn, dinamik yaddaş və ya fayl deskriptorları, istisna baş vermədən əvvəl funksiyadan əldə olunubsa, düzgün şəkildə azad ediləcək.

Bu, RAII (Resource Acquisition Is Initialization) istifadə etməklə həyata keçirilir — burada resursun sahibi obyekti ilə onun həyat dövrü əlaqələndirilir. Obyektin konstruktoru resursu əldə edir, destruktor isə onu azad edir. Yığın istisna səbəbindən aşağı doğru açıldıqda, cari blokda yaradılmış obyektlərin destruktorları avtomatik çağrılır və resursların azad olunması təmin edilir.

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

void process_data(const std::string& filename) {
    std::vector<int> data; // Vektor (dinamik yaddaş)
    std::ifstream file(filename); // Resurs: fayl

    if (!file.is_open()) {
        throw std::runtime_error("Fayl açıla bilmir"); // İstisna - fayl açıla bilməz
    }

    int value;
    while (file >> value) { // Məlumatların oxunması - istisna ata bilər
        data.push_back(value); // Yaddaş çatışmazlığı halında istisna ata bilər
    }

    // Əgər istisna bu nöqtədən əvvəl atılsa (məsələn, faylın açılması, oxunması və ya vektora əlavə olunması zamanı),
    // file (faylı bağlayır) və data (yaddaşı azad edir) destruktorları avtomatik çağrılır,
    // əsas təhlükəsizlik zəmanətini təmin edir: fayl bağlanıb, yaddaş azad olunub,
    // lakin data vəziyyəti qeyri-müəyyən ola bilər (qismən doldurulmuş).

    // Data ilə əlavə işləmə...
    // ...
} // file və data destruktorları burada çağrılır, əgər istisna atılmayıbsa

Əsas zəmanətlə:

  • Bütün sinif invariantləri pozula bilər.
  • Məlumatlar qismən dəyişdirilə bilər.
  • Resurslar sızmır.

Bu, güclü zəmanətdən (istisna baş verdikdə proqram vəziyyəti dəyişmir) zəifdir və zəmanət yoxdur (proqram vəziyyəti qeyri-müəyyəndir, sızmalar baş verə bilər). Standart kitabxanada, çoxsaylı əməliyyatlar əsas zəmanət təmin edir ki, bu da istisnalarla düzgün işləmək üçün minimal tələbatdır.