Sobes.tech
Middle

C++-də shared_ptr necə işləyir?

sobes.tech Süni İntellekt

AI-dan cavab

shared_ptr — bu ağıllı göstəricidir ki, bölüşdürülən resursun mülkiyyət semantikasını həyata keçirir. O, obyektə işarə edən göstərici və idarəetmə blokuna işarə edən göstərici saxlayır.

İdarəetmə bloku aşağıdakılardan ibarətdir:

  • Güclü istinadçı sayğacı (reference count).
  • Zəif istinadçı sayğacı (weak count).
  • İstifadəçi tərəfindən təyin olunan silmə funksoru (deleter), əgər təyin olunubsa.
  • İstifadəçi tərəfindən təyin olunan ayırıcı, əgər təyin olunubsa.
  • Saxlanılan obyektə işarəçi (shared_ptrdə saxlanılan ilə eyni).

İş prinsipi:

  1. Yaradıcılıq: Birinci shared_ptr obyektə işarə etdikdə, idarəetmə bloku yaradılır və istinadçı sayğaclar başlanğıc dəyərlərinə təyin olunur: güclü — 1, zəif — 0.
    std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // Bir int obyekti və idarəetmə bloku yaradır
    
  2. Kopyalama: shared_ptr kopyalandıqda, idarəetmə blokundakı güclü istinadçı sayğacı 1 artır.
    std::shared_ptr<int> ptr2 = ptr1; // Güclü istinadçı sayğacını artırır
    
  3. Təyin etmə: shared_ptr-ə təyin etdikdə, köhnə resurs azaldılır (güclü istinadçı sayğacı azalır), yeni resurs isə artırılır (artır).
    std::shared_ptr<int> ptr3;
    ptr3 = ptr1; // ptr3-ün köhnə resursunu azaldır, ptr1-ın resursunu artırır
    
  4. Silinmə: shared_ptr-in məhv edilməsi (məsələn, scope-dan çıxmaq) zamanı güclü istinadçı sayğacı azaldılır.
    {
        std::shared_ptr<int> ptr4 = ptr1; // Güclü istinadçı sayğacını artırır
        // ptr4 scope-dan çıxır
    } // Güclü istinadçı sayğacını azaldır
    
  5. Resursun sərbəst buraxılması: Güclü istinadçı sayğacı sıfıra çatanda, resurs (shared_ptr-in göstərdiyi obyekt) silinir, təyin olunmuş silici istifadə edilərək (və ya delete default).
  6. İdarəetmə blokunun sərbəst buraxılması: Hər iki sayğac (güclü və zəif) sıfıra çatanda, idarəetmə bloku sərbəst buraxılır.

Üstünlüklər:

  • Paylaşılan resurslar üçün avtomatik yaddaş idarəsi.
  • İki dəfə sərbəst buraxmaya qarşı təhlükəsizlik.
  • Fərdiləşdirilmiş silici funktorların dəstəyi.

Çatışmazlıqlar:

  • Siklik əlaqələr yaddaş sızmalarına səbəb ola bilər (weak_ptr ilə həll olunur).
  • İdarəetmə bloku və atomik əməliyyatlar sayğaclar üzərində kiçik əlavə xərclər.
  • shared_ptr-in öz əməliyyatlarında (kopyalama, təyin etmə, göstəricinin dəyişdirilməsi) təhlükəsizlik, lakin obyekt ilə deyil, ona işarə edən obyektlə bağlıdır.