Sobes.tech
Junior

Milyen okos mutatókat (smart pointers) ismersz?

sobes.tech MI

Válasz az MI-től

std::unique_ptr, std::shared_ptr, std::weak_ptr, std::auto_ptr (elavult C++11-ben és eltávolítva C++17-ben).

  • std::unique_ptr: Exkluzív tulajdonjog a forráshoz. A forrás felszabadul, amikor a mutató kilép a hatókörből vagy resetelésre kerül. Nem enged másolást, csak mozgást.

    #include <memory>
    
    int main() {
        std::unique_ptr<int> ptr(new int(5));
        // std::unique_ptr<int> ptr2 = ptr; // Hiba: nem másolható
        std::unique_ptr<int> ptr3 = std::move(ptr); // Mozgatás
        return 0;
    }
    
  • std::shared_ptr: Közös tulajdonjog a forráshoz. Referenciaszámlálót használ. A forrás felszabadul, amikor az utolsó shared_ptr, amely rá mutat, kilép a hatókörből vagy resetelésre kerül. Másolást támogat.

    #include <memory>
    
    int main() {
        std::shared_ptr<int> ptr1(new int(10));
        std::shared_ptr<int> ptr2 = ptr1; // Másolás, a számláló növekszik
        return 0;
    }
    
  • std::weak_ptr: Nem birtokolja a forrást, és nem növeli a shared_ptr referencianszámlálóját. Ciklikus hivatkozások megelőzésére használják. A forráshoz való hozzáféréshez shared_ptr-t szerez a lock() metódussal.

    #include <memory>
    
    int main() {
        std::shared_ptr<int> shared_ptr_inst(new int(20));
        std::weak_ptr<int> weak_ptr_inst = shared_ptr_inst; // Weak_ptr létrehozása
    
        if (auto locked_ptr = weak_ptr_inst.lock()) {
            // Sikeresen szerzett `shared_ptr`, használható a forrás
        } else {
            // A forrás már felszabadult
        }
        return 0;
    }
    
  • std::auto_ptr: Elavult okosmutató, tulajdonjogot jelent másoláskor, ami nem kívánt viselkedést eredményezett. Új kódban nem szabad használni.

A shared_ptr és weak_ptr közötti különbségek:

Jellemző std::shared_ptr std::weak_ptr
Tulajdonjog a forráshoz Igen Nem
Referencsszámoló Növeli Nem növeli
Forrás felszabadítása Igen, amikor a számláló 0 Nem
Ciklikus hivatkozások Potenciális problémák Segít megelőzni őket
Hozzáférés a forráshoz Közvetlenül operator*, operator-> lock() metóduson keresztül