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_ptryaradıldıqda artır.shared_ptryox 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ənweak_ptryaradıldıqda artır.weak_ptryox 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.