Sobes.tech
Junior
222

Kokie yra išmanieji rodyklės C++?

Atsakymas iš AI

sobes.tech AI

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

  • std::unique_ptr:

    • Išskirtinė objekto nuosavybė.
    • Negali būti kopijuotas, bet gali būti perkeliamas (std::move).
    • Automatiškai ištrina objektą išeinant iš matymo srities arba sunaikinant unique_ptr.
    • Lengvas, neturi papildomų išlaidų nuorodų skaitiklio.
    #include <memory>
    
    // `unique_ptr` sukūrimas
    std::unique_ptr<int> up1(new int(10));
    
    // Nuosavybės perkėlimas
    std::unique_ptr<int> up2 = std::move(up1);
    
    // up1 dabar nullptr
    // up2 valdo objektą
    
  • std::shared_ptr:

    • Bendras objekto valdymas.
    • Naudoja nuorodų skaitiklį, stebintį, kiek shared_ptr nurodo į išteklių.
    • Objektas ištrinamas, kai paskutinis shared_ptr jį sunaikina.
    • Gali būti kopijuojamas ir perkeltas.
    • Turi papildomas išlaidas nuorodų skaitikliui (paprastai atskirai priskiriama).
    • Gali atsirasti ciklinės nuorodos, kurios sukelia atminties nutekėjimą.
    #include <memory>
    
    // `shared_ptr` sukūrimas
    std::shared_ptr<int> sp1 = std::make_shared<int>(20);
    
    // Nuosavybės kopijavimas
    std::shared_ptr<int> sp2 = sp1; // Nuorodų skaitiklis didėja
    
    // sp1 ir sp2 valdo objektą
    
  • std::weak_ptr:

    • Nevaldo objekto.
    • Atstovauja "silpną" nuorodą į objektą, kurį valdo vienas ar keli shared_ptr.
    • Naudojama ciklinių nuorodų prevencijai tarp shared_ptr.
    • Nepadidina nuorodų skaitiklio.
    • Norint saugiai pasiekti objektą, reikia paversti į shared_ptr naudojant lock() metodą. Jei objektas jau ištrintas, lock() grąžins tuščią shared_ptr.
    #include <memory>
    
    // `shared_ptr` sukūrimas
    std::shared_ptr<int> sp = std::make_shared<int>(30);
    
    // `weak_ptr` sukūrimas iš `shared_ptr`
    std::weak_ptr<int> wp = sp;
    
    // Patikrinimas ir naudojimas
    if (auto shared_from_weak = wp.lock()) {
        // Pasiekti objektą per shared_from_weak
    } else {
        // Objekto jau nėra
    }