Sobes.tech
Middle

Hansı əsas üzərində bir neçə shared_ptr obyekti eyni göstəriciyə istinad edə bilər?

sobes.tech Süni İntellekt

AI-dan cavab

Bir neçə obyekt std::shared_ptr, idarəetmə bloku (control block) mövcudluğu sayəsində eyni göstəriciyə istinad edə bilər.

İdarəetmə bloku, idarə olunan obyektlə əlaqəli olub, aşağıdakılardan ibarətdir:

  • Güclü istinad sayğacı (strong reference count): Eyni obyekt üçün yeni shared_ptr yaradıldıqda artır. shared_ptr yox edildikdə azaldılır. Sıfıra çatanda, əlaqəli obyekt (göstərici) silinir.
  • Zəif istinad sayğacı (weak reference count): std::weak_ptr üçün istifadə olunur. shared_ptr-dən weak_ptr yaradıldıqda artır. weak_ptr yox edildikdə azaldılır. Hər iki sayğac sıfıra çatdıqda, idarəetmə bloku silinir.
  • İdarə olunan obyektə aid öz göstərici: Datanın göstəricisi deyil, blok tərəfindən idarə olunan göstəricidir.

Mövcud shared_ptr-dən başqa shared_ptr yaradarkən (kopyalama, təyin etmə-kopyalama), hər ikisi eyni idarəetmə blokundan istifadə etməyə başlayır və bu blokdakı güclü istinad sayğacı artır.

Nümunə:

#include <memory>
#include <iostream>

struct MyData {
    int value;
    MyData(int v) : value(v) { std::cout << "MyData(" << value << ") yaradıldı.\n"; }
    ~MyData() { std::cout << "MyData(" << value << ") silindi.\n"; }
};

int main() {
    // Birinci shared_ptr yaradılır.
    // İdarəetmə bloku və MyData obyekti yaradılır.
    // Sayğaclar: güclü: 1, zəif: 0.
    std::shared_ptr<MyData> ptr1 = std::make_shared<MyData>(10);
    std::cout << "ptr1 istifadə sayı: " << ptr1.use_count() << "\n";

    // ptr1-dən ikinci shared_ptr yaradılır.
    // Eyni idarəetmə bloku istifadə olunur.
    // Güclü sayğac 2-yə artır.
    std::shared_ptr<MyData> ptr2 = ptr1;
    std::cout << "ptr1 istifadə sayı: " << ptr1.use_count() << "\n";
    std::cout << "ptr2 istifadə sayı: " << ptr2.use_count() << "\n";

    // ptr1-dən üçüncü shared_ptr yaradılır.
    // Eyni idarəetmə bloku istifadə olunur.
    // Güclü sayğac 3-ə artır.
    std::shared_ptr<MyData> ptr3 = ptr1;
     std::cout << "ptr1 istifadə sayı: " << ptr1.use_count() << "\n";
    std::cout << "ptr2 istifadə sayı: " << ptr2.use_count() << "\n";
    std::cout << "ptr3 istifadə sayı: " << ptr3.use_count() << "\n";

    std::cout << "Səhnədən çıxış.\n";
    // ptr3 səhnədən çıxır.
    // Güclü sayğac 2-yə enir.
    // ptr2 səhnədən çıxır.
    // Güclü sayğac 1-ə enir.
    // ptr1 səhnədən çıxır.
    // Güclü sayğac 0-a enir.
    // MyData obyekti silinir.
    // İdarəetmə bloku silinir.
}

Hər shared_ptr obyekti öz idarəetmə bloku göstəricisinə və öz məlumat obyektinə göstəricisinə malikdir. shared_ptr-in kopyalanması zamanı, hər iki göstərici kopyalanır və ümumi idarəetmə blokundakı güclü istinad sayğacı artırılır. Beləliklə, bütün shared_ptr-lər eyni idarəetmə blokuna işarə edir, bu blok isə onların nüsxələrinin sayını izləyir və idarə olunan resursun yox ediləcəyi vaxtı müəyyən edir.