Middle
C++ da unique_ptr qanday ishlaydi?
sobes.tech AI
AIdan javob
std::unique_ptr — bu aqlli ko‘rsatkich bo‘lib, dinamik tarzda ajratilgan ob’ektning eksklyuziv egaligini amalga oshiradi. U avtomatik xotira boshqaruvini ta’minlaydi: unique_ptr ko‘rsatadigan ob’ekt unique_ptr yo‘q qilinishi bilan avtomatik ravishda o‘chiriladi.
Asosiy xususiyatlar:
- Eksklyuziv egalik: Har qanday vaqtda, faqat bitta
unique_ptrmuayyan ob’ektni egallashi mumkin. - Nusxa olishning yo‘qligi:
unique_ptrnusxa ko‘chirib bo‘lmaydi. Bu bir ob’ektning ko‘p egalariga ega bo‘lishi va "ikkilamchi o‘chirish" muammosini oldini oladi. - Harakat semantikasini: Ob’ekt egasligi
std::moveyordamida birunique_ptrdan boshqasiga o‘tkazilishi mumkin. - Moslashtiriladigan o‘chirgich: Maxsus resurslarni bo‘shatish usullarini boshqarish uchun o‘zingizning o‘chirgichingizni taqdim etishingiz mumkin.
Ishlash prinsipi RAII (Resource Acquisition Is Initialization) asosida: resurs (dinamik ajratilgan xotira) ob’ekt yaratilganda olinadi (unique_ptr) va o‘chirilganda bo‘shatiladi.
#include <memory> // unique_ptr uchun
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass yaratildi\n"; }
~MyClass() { std::cout << "MyClass o‘chirildi\n"; }
};
int main() {
{
// MyClass ob’ektini egallovchi unique_ptr yaratish
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
// Hozir, ptr1 muayyan ob’ektning eksklyuziv egasidir
// auto ptr2 = ptr1; // Xato: nusxa ko‘chirib bo‘lmaydi
// Egashuvni ptr1 dan ptr2 ga o‘tkazish
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
// Ko‘chirishdan so‘ng, ptr1 ob’ektga ega emas (nullptr bo‘ldi)
if (!ptr1) {
std::cout << "ptr1 ob’ektga ega emas: " << (ptr1 ? "Ha" : "Yo‘q") << "\n";
}
// ptr2 ning amal qilish muddati bu yerda tugaydi.
// ptr2 o‘chiriladi va unga egalik qilgan MyClass ob’ekti avtomatik ravishda o‘chiriladi.
} // MyClass ob’ekti bu yerda o‘chiriladi
std::cout << "main yakun.\n";
return 0;
}
Raw pointer bilan taqqoslaganda:
| Xususiyat | raw pointer |
std::unique_ptr |
|---|---|---|
| Resurs egaligi | Belgilanmagan | Eksklyuziv |
| Avtomatik o‘chirish | Yo‘q | Ha |
| Nusxa olish semantikasini | Ha | Yo‘q (faqat harakat) |
| Xotira oqib ketish xavfi | Yuqori | Past |
Umuman olganda, unique_ptr C++11 va undan yuqori versiyalarda dinamik xotira boshqarish uchun afzal ko‘rilgan usul bo‘lib, qat’iy egalik va avtomatik resurslarni bo‘shatishni talab qiladigan hollarda ishlatiladi.