Qaysi asosda bir nechta shared_ptr ob'ektlari bir xil ko'rsatkichga murojaat qilishi mumkin?
sobes.tech AI
AIdan javob
Bir nechta std::shared_ptr obyekti, kontrol bloki (control block) mavjudligi tufayli, bir xil ko'rsatgichga murojaat qilishi mumkin.
Boshqaruv bloki, boshqarilayotgan ob'ekt bilan bog'liq bo'lib, quyidagilarni o'z ichiga oladi:
- Mustahkam referenslar hisoblagichi (strong reference count): Yangi
shared_ptryaratilganda, aynan shu ob'ekt uchun oshadi.shared_ptryo'q qilinayotganda kamayadi. Agar nolga teng bo'lsa, bog'langan ob'ekt (ko'rsatgich) o'chiriladi. - Zaif referenslar hisoblagichi (weak reference count):
std::weak_ptruchun ishlatiladi.shared_ptrdanweak_ptryaratilganda oshadi.weak_ptryo'q qilinayotganda kamayadi. Ikkala hisoblagich ham nolga teng bo'lsa, boshqaruv bloki o'chiriladi. - Boshqarilayotgan ob'ektga o'ziga xos ko'rsatgich: Ma'lumotlar ko'rsatgichidan farqli o'laroq, boshqaruv bloki tomonidan boshqariladi.
Agar siz mavjud shared_ptr dan yangi shared_ptr yaratsangiz (nusxa, tayinlash-nusxa), ular bir xil boshqaruv blokidan foydalanishni boshlaydi va bu blokdagi mustahkam referenslar hisoblagichi oshadi.
Misol:
#include <memory>
#include <iostream>
struct MyData {
int value;
MyData(int v) : value(v) { std::cout << "MyData(" << value << ") yaratildi.\n"; }
~MyData() { std::cout << "MyData(" << value << ") o'chirildi.\n"; }
};
int main() {
// Birinchi shared_ptr yaratiladi.
// Boshqaruv bloki va MyData ob'ekti yaratiladi.
// Hisoblagichlar: kuchli: 1, zaif: 0.
std::shared_ptr<MyData> ptr1 = std::make_shared<MyData>(10);
std::cout << "ptr1 ning foydalanish hisoblagichi: " << ptr1.use_count() << "\n";
// ptr1 dan ikkinchi shared_ptr yaratiladi.
// Bir xil boshqaruv bloki ishlatiladi.
// Kuchli hisoblagich 2 ga oshadi.
std::shared_ptr<MyData> ptr2 = ptr1;
std::cout << "ptr1 ning foydalanish hisoblagichi: " << ptr1.use_count() << "\n";
std::cout << "ptr2 ning foydalanish hisoblagichi: " << ptr2.use_count() << "\n";
// ptr1 dan uchinchi shared_ptr yaratiladi.
// Bir xil boshqaruv bloki ishlatiladi.
// Kuchli hisoblagich 3 ga oshadi.
std::shared_ptr<MyData> ptr3 = ptr1;
std::cout << "ptr1 ning foydalanish hisoblagichi: " << ptr1.use_count() << "\n";
std::cout << "ptr2 ning foydalanish hisoblagichi: " << ptr2.use_count() << "\n";
std::cout << "ptr3 ning foydalanish hisoblagichi: " << ptr3.use_count() << "\n";
std::cout << "Doiradan chiqish.\n";
// ptr3 doiradan chiqadi.
// Kuchli hisoblagich 2 ga tushadi.
// ptr2 doiradan chiqadi.
// Kuchli hisoblagich 1 ga tushadi.
// ptr1 doiradan chiqadi.
// Kuchli hisoblagich 0 ga tushadi.
// MyData ob'ekti o'chiriladi.
// Boshqaruv bloki o'chiriladi.
}
Har bir shared_ptr obyekti o'zining boshqaruv bloki ko'rsatgichiga va o'zining ma'lumotlar ko'rsatgichiga ega. shared_ptr nusxa ko'chirilganda, ikkala ko'rsatgich ham nusxa ko'chiriladi va umumiy boshqaruv blokidagi kuchli referenslar hisoblagichi oshadi. Shu tarzda, barcha shared_ptrlar bir xil boshqaruv blokiga murojaat qiladi, u ularning nusxalarining egalik sonini kuzatadi va boshqarilayotgan resursning o'lim vaqtini belgilaydi.