Sobes.tech
Middle

Ի՞նչ է բազային անվտանգության երաշխավորությունը C++ ստանդարտ գրադարանի համատեքստում և ինչպես է այն ազդում ռեսուրսների կառավարման վրա։

sobes.tech AI

Պատասխան AI-ից

Հիմնական անվտանգության երաշխիք (հիմնական արտահայտության անվտանգության մակարդակ) նշանակում է, որ արտակարգ իրավիճակի առաջացման դեպքում ծրագիրը գտնվում է ճիշտ, թեև ոչ պարտադիր կանխատեսելի վիճակում: Արժեքները, ինչպիսիք են դինամիկ հիշողությունը կամ ֆայլային դեսկրիպտորները, որոնք ձեռք են բերվել ֆունկցիայից առաջ արտակարգ իրավիճակի առաջացման, ճիշտ կերպով ազատվում են:

Սա հասնում է RAII (Resource Acquisition Is Initialization) օգտագործմամբ՝ այն идиոմով, որտեղ ռեսուրսի տիրապետությունը կապված է օբյեկտի կյանքի ցիկլի հետ: Օբյեկտի կոնստրուկտորը ձեռք է բերում ռեսուրսը, իսկ դեստրուկտորը՝ ազատում: Երբ բլոկի վերևից վերև ընկնում է արտակարգ իրավիճակ, ստեղծված օբյեկտների դեստրուկտորները ավտոմատ կերպով կանչվում են, ապահովելով ռեսուրսների ազատում:

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

void process_data(const std::string& filename) {
    std::vector<int> data; // Վեկտոր (դինամիկ հիշողություն)
    std::ifstream file(filename); // Ֆայլ (ռեսուրս)

    if (!file.is_open()) {
        throw std::runtime_error("Cannot open file"); // Արտակարգ իրավիճակ - ֆայլը չի բացվի
    }

    int value;
    while (file >> value) { // Դատարկում տվյալները - կարող է արտակարգ իրավիճակ առաջացնել
        data.push_back(value); // Կարող է արտակարգ իրավիճակ առաջացնել հիշողության պակասից
    }

    // Եթե արտակարգ իրավիճակ առաջանա այս կետից առաջ (օրինակ, ֆայլի բացման ժամանակ, ընթերցման կամ vector-ին ավելացման ժամանակ),
    // file-ի (փակել ֆայլը) և data-ի (ազատել հիշողությունը) դեստրուկտորները կկանչվեն,
    // ապահովելով հիմնական երաշխիք՝ ֆայլը փակ է, հիշողությունը ազատ է, բայց data-ի վիճակը կարող է լինել անորոշ (մասամբ լցված):

    // Ավելին՝ data-ի հետ աշխատանք...
    // ...
} // file-ի և data-ի դեստրուկտորները կանչվում են այստեղ, եթե արտակարգ իրավիճակ չի առաջացել

Հիմնական երաշխիքով՝

  • Բոլոր դասի ինվարիանտները կարող են խախտվել:
  • Տվյալները կարող են փոփոխվել մասամբ:
  • Ռեսուրսները չեն թափվում:

Սա ավելի թույլ է, քան ուժեղ երաշխիքը (ծրագիրը չի փոխվում արտակարգ իրավիճակից հետո), և չկա երաշխիք (ծրագրի վիճակը անորոշ է, հնարավոր են լճումներ): Ստանդարտ գրադարանում շատ գործողություններ ապահովում են հիմնական երաշխիք, որը նվազագույն պահանջն է արտակարգ իրավիճակների ճիշտ աշխատանքի համար։