Sobes.tech
Middle

როგორ მუშაობს shared_ptr C++-ში?

sobes.tech AI

პასუხი AI-სგან

shared_ptr — դա խելացի ցուցիչ է, որը իրականացնում է բաժանվող ռեսուրսի սեփականության սիմանթիկա։ Այն պահում է ցուցիչ օբյեկտի և կառավարման բլոկի վրա։

Կառավարող բլոկը պարունակում է՝

  • Ուղղակի թվային հաշվիչ (reference count)։
  • Թույլ թվային հաշվիչ (weak count)։
  • Օգտագործողի ֆունկցիոներ՝ ջնջելու համար (deleter), եթե սահմանված է։
  • Օգտագործողի ամպլիկատոր, եթե սահմանված է։
  • Ցուցիչ պահվող օբյեկտի վրա (նույնը, ինչ պահվում է shared_ptr-ում)։

Աշխատանքի սկզբունքը:

  1. Ստեղծում: Երբ առաջին shared_ptr-ը ստեղծվում է օբյեկտի վրա, կառավարման բլոկը ստեղծվում է, ցուցիչների հաշվիչները inicailiseer-վում են՝ ուժեղները՝ 1, թույլերը՝ 0։
    std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // Ստեղծում է int օբյեկտ և կառավարման բլոկ
    
  2. Կոպիավորում: Երբ shared_ptr-ը կոպիրվում է, կառավարման բլոկի ուժեղ ցուցիչը ավելանում է 1-ով։
    std::shared_ptr<int> ptr2 = ptr1; // Ավելացնում է ուժեղ ցուցիչը
    
  3. Հատկացում: Երբ shared_ptr-ը հանձնարարվում է հին ռեսուրսին, ուժեղ ցուցիչը նվազում է (decrement), նոր ռեսուրսին՝ ավելանում (increment)։
    std::shared_ptr<int> ptr3;
    ptr3 = ptr1; // Հնից նվազում, նորից ավելանում
    
  4. Հեռացում: Երբ shared_ptr-ը ոչնչացվում է (օրինակ՝ դուրս է գալիս տեսադաշտից), ուժեղ ցուցիչը նվազում է։
    {
        std::shared_ptr<int> ptr4 = ptr1; // Ավելացնում է ուժեղ ցուցիչը
        // ptr4 դուրս է գալիս տեսադաշտից
    } // Նվազում է ուժեղ ցուցիչը
    
  5. Ռեսուրսի ազատում: Երբ ուժեղ ցուցիչների հաշիվը հասնում է զրոյի, ռեսուրսը (օբյեկտը, որի վրա ցույց է տալիս shared_ptr) ջնջվում՝ օգտագործելով նշված ջնջման ֆունկցոր։
  6. Կառավարող բլոկի ազատում: Կառավարող բլոկը ազատվում է, երբ երկու հաշվիչներն էլ՝ ուժեղ և թույլ, հասնում են զրոյի։

Առավելություններ:

  • Ավտոմատ կառավարում հիշողության համար բաժանվող ռեսուրսների։
  • Անվտանգություն՝ կրկնակի ազատումից։
  • Օգտագործողի ֆունկցորների աջակցում։

Մակարդակներ:

  • Ցիկլային հղումները կարող են հանգեցնել հիշողության լիքերի (լուծվում է weak_ptr-ով)։
  • Փոքր չափով ավելացումներ՝ կառավարման բլոկի և ատոմային օպերացիաների պատճառով։
  • Օպերացիաների թափանցիկություն՝ shared_ptr-ի կոպիրման, նշանակման և փոփոխության ժամանակ, բայց ոչ՝ օբյեկտի վրա, որի վրա ցույց է տալիս։