Sobes.tech
Junior

C++-də hansı ağıllı göstəricilər mövcuddur?

sobes.tech Süni İntellekt

AI-dan cavab

std::unique_ptr, std::shared_ptr, std::weak_ptr.

  • std::unique_ptr:

    • Ob'ektin ekskluziv mülkiyyəti.
    • Kopyalanmaz, amma köçürülə bilər (std::move).
    • unique_ptr-in sahəsindən çıxanda və ya məhv olunduqda, ob'ekt avtomatik silinir.
    • Yüngüldür, referans sayğacına əlavə xərc yoxdur.
    #include <memory>
    
    // unique_ptr yaradılması
    std::unique_ptr<int> up1(new int(10));
    
    // Mülkiyyətin köçürülməsi
    std::unique_ptr<int> up2 = std::move(up1);
    
    // up1 indi nullptr
    // up2 ob'ektə sahibdir
    
  • std::shared_ptr:

    • Ob'ektin ümumi mülkiyyəti.
    • Resursa neçə shared_ptr-ın istinad etdiyini izləmək üçün referans sayğacı istifadə olunur.
    • Son shared_ptr-ın məhv olmasında, ob'ekt silinir.
    • Köçürülə və hərəkət etdirilə bilər.
    • Referans sayğacı üçün əlavə xərc var (adətən ayrıca ayrılır).
    • Döngüvi istinadlar yarada bilər, bu isə yaddaş sızmasına səbəb olar.
    #include <memory>
    
    // shared_ptr yaradılması
    std::shared_ptr<int> sp1 = std::make_shared<int>(20);
    
    // Mülkiyyətin kopyalanması
    std::shared_ptr<int> sp2 = sp1; // Sayğac artır
    
    // sp1 və sp2 ob'ektə sahibdir
    
  • std::weak_ptr:

    • Ob'ektə sahib deyil.
    • Bir və ya bir neçə shared_ptr tərəfindən idarə olunan ob'ektə "zəif" istinad edir.
    • shared_ptr-lar arasında döngüvi istinadların qarşısını almaq üçün istifadə olunur.
    • Ob'ektin referans sayğacını artırmır.
    • Ob'ektə təhlükəsiz giriş üçün, lock() metodu ilə shared_ptr-a çevrilməlidir. Əgər ob'ekt artıq silinibsə, lock() boş shared_ptr qaytaracaq.
    #include <memory>
    
    // shared_ptr yaradılması
    std::shared_ptr<int> sp = std::make_shared<int>(30);
    
    // shared_ptr-dan weak_ptr yaradılması
    std::weak_ptr<int> wp = sp;
    
    // Ob'ektin yoxlanması və istifadəsi
    if (auto shared_from_weak = wp.lock()) {
        // shared_from_weak vasitəsilə ob'ektə giriş
    } else {
        // Ob'ekt artıq silinib
    }