Sobes.tech
Middle

Ի՞նչ ցուցիչ է օգտագործվում shared_ptr- ի հետ։

sobes.tech AI

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

weak_ptr.

#include <memory>
#include <iostream>

int main() {
    auto shared = std::make_shared<int>(10); // Ստեղծում ենք shared_ptr
    std::weak_ptr<int> weak = shared;      // Ստեղծում ենք weak_ptr shared_ptr-ից

    if (auto locked = weak.lock()) {       // Փորձում ենք ստանալ shared_ptr-ից weak_ptr
        std::cout << "Արժեքը: " << *locked << std::endl;
    } else {
        std::cout << "Օբյեկտը ջնջված է." << std::endl;
    }

    shared.reset(); // Օբյեկտը, որի վրա ցույց է տալիս shared_ptr-ը, ջնջվում է

    if (auto locked = weak.lock()) {       // Երկրորդ փորձը, օբյեկտը արդեն ջնջված է
        std::cout << "Արժեքը: " << *locked << std::endl;
    } else {
        std::cout << "Օբյեկտը ջնջված է." << std::endl;
    }

    return 0;
}

weak_ptr-ը համատեղ օգտագործվում է shared_ptr-ի հետ՝ ցիկլային հղումներն լուծելու և հիշողության լիքները կանխելու համար, երբ երկու կամ ավելի օբյեկտներ, որոնք կառավարում են shared_ptr, հղում են միմյանց, և հղումների հաշվիչները երբեք չեն հասնում զրոյի։

Հիմնական հատկությունները weak_ptr-ի:

  • Չավելացնում է հղումների հաշվիչը: weak_ptr պահպանում է «թույլ» հղում shared_ptr`-ով կառավարվող օբյեկտին, առանց ավելացնելու նրա «ուժեղ» հղումների հաշվիչը:
  • Օբյեկտի կյանքի ժամկետի ստուգում: lock() մեթոդով կարելի է փորձել ստանալ shared_ptrweak_ptr-ից։ Եթե օբյեկտը դեռ կենդանի է, lock() վերադարձնում է վավեր shared_ptr; հակառակ դեպքում՝ դատարկ:
  • Առանց ուղղակի մուտքի: weak_ptr չի ապահովում ուղղակի մուտք օբյեկտի պարունակությանը * կամ -> օպերատորների միջոցով։ Մուտքը հնարավոր է միայն lock()-ի հաջող զանգի դեպքում:

weak_ptr-ի օգտագործումը ստանդարտ միջոց է ցիկլային հղումներն ընդհատելու համար տվյալների կառուցվածքներում, որոնք օգտագործում են shared_ptr, օրինակ՝ գրաֆներում կամ երկկողմ կապակցված ցանկերում։