Middle
Ինչպես է աշխատում shared_ptr-ը C++-ում?
sobes.tech AI
Պատասխան AI-ից
shared_ptr — դա խելացի ցուցիչ է, որը իրականացնում է բաժանվող ռեսուրսի սեփականության սիմանթիկա։ Այն պահում է ցուցիչ օբյեկտի և կառավարման բլոկի վրա։
Կառավարող բլոկը պարունակում է՝
- Ուղղակի թվային հաշվիչ (reference count)։
- Թույլ թվային հաշվիչ (weak count)։
- Օգտագործողի ֆունկցիոներ՝ ջնջելու համար (deleter), եթե սահմանված է։
- Օգտագործողի ամպլիկատոր, եթե սահմանված է։
- Ցուցիչ պահվող օբյեկտի վրա (նույնը, ինչ պահվում է
shared_ptr-ում)։
Աշխատանքի սկզբունքը:
- Ստեղծում: Երբ առաջին
shared_ptr-ը ստեղծվում է օբյեկտի վրա, կառավարման բլոկը ստեղծվում է, ցուցիչների հաշվիչները inicialiseer-վում են՝ ուժեղները՝ 1, թույլերը՝ 0։std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // Ստեղծում է int օբյեկտ և կառավարման բլոկ - Կոպիավորում: Երբ
shared_ptr-ը կոպիրվում է, կառավարման բլոկի ուժեղ ցուցիչը ավելանում է 1-ով։std::shared_ptr<int> ptr2 = ptr1; // Ավելացնում է ուժեղ ցուցիչը - Հատկացում: Երբ
shared_ptr-ը հանձնարարվում է հին ռեսուրսին, ուժեղ ցուցիչը նվազում է (decrement), նոր ռեսուրսին՝ ավելանում (increment)։std::shared_ptr<int> ptr3; ptr3 = ptr1; // Հնից նվազում, նորից ավելանում - Հեռացում: Երբ
shared_ptr-ը ոչնչացվում է (օրինակ՝ դուրս է գալիս տեսադաշտից), ուժեղ ցուցիչը նվազում է։{ std::shared_ptr<int> ptr4 = ptr1; // Ավելացնում է ուժեղ ցուցիչը // ptr4 դուրս է գալիս տեսադաշտից } // Նվազում է ուժեղ ցուցիչը - Ռեսուրսի ազատում: Երբ ուժեղ ցուցիչների հաշիվը հասնում է զրոյի, ռեսուրսը (օբյեկտը, որի վրա ցույց է տալիս
shared_ptr) ջնջվում՝ օգտագործելով նշված ջնջման ֆունկցոր։ - Կառավարող բլոկի ազատում: Կառավարող բլոկը ազատվում է, երբ երկու հաշվիչներն էլ՝ ուժեղ և թույլ, հասնում են զրոյի։
Առավելություններ:
- Ավտոմատ կառավարում հիշողության համար բաժանվող ռեսուրսների։
- Անվտանգություն՝ կրկնակի ազատումից։
- Օգտագործողի ֆունկցորների աջակցում։
Մակարդակներ:
- Ցիկլային հղումները կարող են հանգեցնել հիշողության լիքերի (լուծվում է
weak_ptr-ով)։ - Փոքր չափով ավելացումներ՝ կառավարման բլոկի և ատոմային օպերացիաների պատճառով։
- Օպերացիաների թափանցիկություն՝
shared_ptr-ի կոպիրման, նշանակման և փոփոխության ժամանակ, բայց ոչ՝ օբյեկտի վրա, որի վրա ցույց է տալիս։