Middle
C++-də unique_ptr necə işləyir?
sobes.tech Süni İntellekt
AI-dan cavab
std::unique_ptr — bu ağıllı göstəricidir ki, dinamik olaraq ayrılmış obyektin müstəsna mülkiyyətini həyata keçirir. O, avtomatik yaddaş idarəsini təmin edir: unique_ptr-in göstərdiyi obyekt, unique_ptr-in məhvi zamanı avtomatik olaraq silinir.
Əsas xüsusiyyətlər:
- Müstəsna mülkiyyət: Hər zaman yalnız bir
unique_ptrmüəyyən obyekti idarə edə bilər. - Kopyalama yoxdur:
unique_ptrkopyalana bilməz. Bu, çoxsaylı mülkiyyət və "ikiqat silmə" problemini qarşısını alır. - Hərəkət semantikasını: Obyektin mülkiyyəti
std::moveistifadə edilərək birunique_ptr-dən digərinə ötürülə bilər. - Tənzimlənə bilən silici: Xüsusi resursların azad olunma üsullarını idarə etmək üçün öz silicinizi təmin edə bilərsiniz.
İş prinsipi RAII (Resource Acquisition Is Initialization) əsasında qurulub: resurs (dinamik ayrılmış yaddaş) obyekt yaradılarkən əldə edilir (unique_ptr) və məhv edilərkən azad edilir.
#include <memory> // unique_ptr üçün
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass yaradıldı\n"; }
~MyClass() { std::cout << "MyClass silindi\n"; }
};
int main() {
{
// MyClass obyektini idarə edən unique_ptr yaradılması
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
// Bu anda, ptr1 obyektin müstəsna sahibi olur
// auto ptr2 = ptr1; // Səhv: kopyalama qadağandır
// Mülkiyyətin ptr1-dən ptr2-yə köçürülməsi
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
// Köçürmədən sonra, ptr1 artıq obyektə sahib deyil (nullptr olur)
if (!ptr1) {
std::cout << "ptr1 obyektə sahib deyil: " << (ptr1 ? "Bəli" : "Xeyr") << "\n";
}
// ptr2-nin ömrü burada bitir.
// ptr2 məhv edilir və onun sahibi olduğu MyClass obyekti avtomatik silinir.
} // MyClass obyekti burada silinir
std::cout << "main sonu.\n";
return 0;
}
Raw pointer ilə müqayisədə:
| Xüsusiyyət | raw pointer |
std::unique_ptr |
|---|---|---|
| Resursun mülkiyyəti | Təyin olunmayıb | Eksklüziv |
| Avtomatik silmə | Yox | Bəli |
| Kopyalama semantikasını | Bəli | Yox (yalnız hərəkət) |
| Yaddaş sızması riski | Yüksək | Aşağı |
Ümumiyyətlə, unique_ptr C++11 və daha yuxarı versiyalarda dinamik yaddaşın idarə olunması üçün üstün üsuldur, xüsusən də sərt mülkiyyət və avtomatik resurs azadlığı tələb olunduqda.