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:
- Yaradıcılıq: Birinci
shared_ptrobyektə 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 - Kopyalama:
shared_ptrkopyalandı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 - 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 - 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 - 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ə yadeletedefault). - İ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_ptrilə 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.