Middle
C++ da aqlli ko'rsatkichlar haqida nima bilasiz?
sobes.tech AI
AIdan javob
Aqlli ko'rsatkichlar C++ da oddiy (xom) ko'rsatkichlar ustiga RAII-qoplamlar bo'lib, ajratilgan xotira hayotini avtomatik boshqarishni ta'minlaydi va oqishni oldini oladi.
C++ standarti kutubxonasida asosiy aqlli ko'rsatkich turlari:
std::unique_ptrstd::shared_ptrstd::weak_ptr
std::unique_ptr
- Resursni eksklyuziv tarzda egallaydi.
- Nusxa ko'chirilmaydi, lekin ko'chirilishi mumkin.
- Resursning yagona egaligini ta'minlash uchun ishlatiladi.
- Qo'shimcha xarajatlar minimal, xom ko'rsatkichga teng.
// unique_ptr misoli
#include <memory>
#include <iostream>
int main() {
std::unique_ptr<int> ptr = std::make_unique<int>(10);
std::cout << *ptr << std::endl; // 10
// std::unique_ptr<int> ptr2 = ptr; // Kompilyatsiya xatosi: unique_ptr nusxa ko'chirilmaydi
std::unique_ptr<int> ptr3 = std::move(ptr); // Egallashni ko'chirish
std::cout << *ptr3 << std::endl; // 10
// std::cout << *ptr << std::endl; // Belgilangan xatti-harakat: ptr endi bo'sh
return 0;
}
std::shared_ptr
- Bir nechta ko'rsatkichlar birgalikda resursni egallashiga imkon beradi.
- Referenslar hisoblagichi ishlatiladi. Hisoblagich nolga tushganda, xotira bo'shatiladi.
- Nusxa ko'chirilishi mumkin. Har bir nusxa referenslar hisoblagichini oshiradi.
unique_ptrga nisbatan yuqori xarajatlar, hisoblagichni boshqarish uchun.
// shared_ptr misoli
#include <memory>
#include <iostream>
int main() {
std::shared_ptr<int> ptr1 = std::make_shared<int>(20);
std::cout << *ptr1 << " (use_count: " << ptr1.use_count() << ")" << std::endl; // 20 (use_count: 1)
std::shared_ptr<int> ptr2 = ptr1; // Nusxa, use_count oshadi
std::cout << *ptr1 << " (use_count: " << ptr1.use_count() << ")" << std::endl; // 20 (use_count: 2)
std::shared_ptr<int> ptr3 = ptr1; // Yana nusxa
std::cout << *ptr1 << " (use_count: " << ptr1.use_count() << ")" << std::endl; // 20 (use_count: 3)
return 0;
}
std::weak_ptr
- Resursni egallamaydi va referenslar hisoblagichini oshirmaydi.
shared_ptrorasidagi siklik referenslarni hal qilish uchun ishlatiladi.shared_ptrtomonidan ko'rsatilgan resursga kirish imkonini beradi, lekin uni o'chirishni oldini olmaydi.- Resursga kirish uchun,
weak_ptrnishared_ptrga aylantirish kerak,lock()metodidan foydalanib.
// weak_ptr misoli
#include <memory>
#include <iostream>
int main() {
std::shared_ptr<int> shared_ptr_int = std::make_shared<int>(30);
std::weak_ptr<int> weak_ptr_int = shared_ptr_int;
if (auto locked_ptr = weak_ptr_int.lock()) {
std::cout << *locked_ptr << std::endl; // 30
} else {
std::cout << "Resurs bo'shatildi." << std::endl;
}
shared_ptr_int.reset(); // Resurs bo'shatiladi
if (auto locked_ptr = weak_ptr_int.lock()) {
std::cout << *locked_ptr << std::endl;
} else {
std::cout << "Resurs bo'shatildi." << std::endl; // Resurs bo'shatildi.
}
return 0;
}
Aqlli ko'rsatkichlardan foydalanish zamonaviy C++ da yaxshi amaliyot hisoblanadi, chunki bu xotira boshqaruvidagi xatolik ehtimolini sezilarli darajada kamaytiradi.