Sobes.tech
Junior — Middle

გთხოვთ ახსნათ რეფერენსის გამრიცხველის მუშაობის პრინციპი და მისი გამოყენება მეხსიერების მართვაში

sobes.tech AI

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

Ռեֆերանսի հաշվիչը՝ դա հիշողության կառավարման մեխանիզմ է, որի ժամանակ պահվում է յուրաքանչյուր օբյեկտի ակտիվ հղումների թիվը։ Երբ ստեղծվում է նոր հղում օբյեկտին, հաշվիչը մեծանում է, իսկ երբ հղումը ջնջվում է կամ դառնում անհասանելի, նվազում։ Երբ հաշվիչը հասնում է զրոյի, օբյեկտը համարվում է ոչ օգտագործվող և կարող է ազատվել հիշողությունից։

Այս մոտեցումը օգնում է ավտոմատ կերպով կառավարել օբյեկտների կյանքի տևողությունը և կանխել հիշողության լիքերը։ Սակայն, ռեֆերանսի հաշվիչը ունի թերություն՝ նա չի կարող ճիշտ կառավարել ցիկլային հղումները, երբ օբյեկտները միմյանց վրա հղում են անում, բայց չեն օգտագործվում արտաքինից։

Օգտագործման օրինակ C++-ում՝

class SharedPtr {
    T* ptr;
    int* ref_count;
public:
    SharedPtr(T* p) : ptr(p), ref_count(new int(1)) {}
    SharedPtr(const SharedPtr& sp) {
        ptr = sp.ptr;
        ref_count = sp.ref_count;
        ++(*ref_count);
    }
    ~SharedPtr() {
        if (--(*ref_count) == 0) {
            delete ptr;
            delete ref_count;
        }
    }
};