Sobes.tech
Junior
223

Koji pametni pokazivači postoje u C++?

Одговор од АИ

sobes.tech АИ

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

  • std::unique_ptr:

    • Ekskluzivno vlasništvo nad objektom.
    • Ne može se kopirati, ali se može premjestiti (std::move).
    • Automatski briše objekt pri izlasku iz opsega ili uništenju unique_ptr.
    • Lagana je, bez dodatnih troškova za brojač referenci.
    #include <memory>
    
    // Kreiranje unique_ptr
    std::unique_ptr<int> up1(new int(10));
    
    // Premještanje vlasništva
    std::unique_ptr<int> up2 = std::move(up1);
    
    // up1 sada je nullptr
    // up2 posjeduje objekt
    
  • std::shared_ptr:

    • Dijeljeno vlasništvo nad objektom.
    • Koristi brojač referenci za praćenje koliko shared_ptr pokazuje na resurs.
    • Objekat se briše kada posljednji shared_ptr koji ga pokazuje bude uništen.
    • Može se kopirati i premjestiti.
    • Ima dodatne troškove za brojač referenci (obično odvojeno alociran).
    • Može formirati ciklične reference, što dovodi do curenja memorije.
    #include <memory>
    
    // Kreiranje shared_ptr
    std::shared_ptr<int> sp1 = std::make_shared<int>(20);
    
    // Kopiranje vlasništva
    std::shared_ptr<int> sp2 = sp1; // Brojač referenci se povećava
    
    // sp1 i sp2 posjeduju objekt
    
  • std::weak_ptr:

    • Ne posjeduje objekt.
    • Predstavlja "slabu" referencu na objekt, upravljanu od strane jednog ili više shared_ptr.
    • Koristi se za sprječavanje cikličkih referenci između shared_ptr.
    • Ne povećava brojač referenci objekta.
    • Za siguran pristup objektu, potrebno ga je pretvoriti u shared_ptr pomoću metode lock(). Ako je objekt već izbrisan, lock() će vratiti prazan shared_ptr.
    #include <memory>
    
    // Kreiranje shared_ptr
    std::shared_ptr<int> sp = std::make_shared<int>(30);
    
    // Kreiranje weak_ptr od shared_ptr
    std::weak_ptr<int> wp = sp;
    
    // Provjera i korištenje objekta
    if (auto shared_from_weak = wp.lock()) {
        // Pristup objektu putem shared_from_weak
    } else {
        // Objekt je već izbrisan
    }