Sobes.tech
Junior

Milyen okos mutatók vannak C++-ban?

sobes.tech MI

Válasz az MI-től

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

  • std::unique_ptr:

    • Egyedüli tulajdonjog az objektum felett.
    • Nem másolható, de mozgatható (std::move).
    • Automatikusan törli az objektumot, amikor kilép a hatókörből vagy megsemmisül a unique_ptr.
    • Könnyű, referencia számláló költségek nélkül.
    #include <memory>
    
    // unique_ptr létrehozása
    std::unique_ptr<int> up1(new int(10));
    
    // Tulajdonjog áthelyezése
    std::unique_ptr<int> up2 = std::move(up1);
    
    // up1 most nullptr
    // up2 birtokolja az objektumot
    
  • std::shared_ptr:

    • Megosztott tulajdonjog az objektum felett.
    • Egy referencia számlálót használ, hogy nyomon kövesse, hány shared_ptr mutat az erőforrásra.
    • Az objektum törlődik, amikor az utolsó shared_ptr is megsemmisül, amely rá mutat.
    • Másolható és mozgatható.
    • Extra költségei vannak a referencia számlálónak (általában külön allokálva).
    • Ciklikus hivatkozásokat hozhat létre, ami memória szivárgáshoz vezet.
    #include <memory>
    
    // shared_ptr létrehozása
    std::shared_ptr<int> sp1 = std::make_shared<int>(20);
    
    // Tulajdonjog másolása
    std::shared_ptr<int> sp2 = sp1; // A referencia számláló növekszik
    
    // sp1 és sp2 az objektumot birtokolják
    
  • std::weak_ptr:

    • Nem birtokolja az objektumot.
    • Egy "gyenge" hivatkozást képvisel az objektumra, amit egy vagy több shared_ptr kezel.
    • Ciklikus hivatkozások megelőzésére használják a shared_ptr-ok között.
    • Nem növeli az objektum referencia számlálóját.
    • Biztonságos hozzáféréshez az objektumhoz, át kell alakítani shared_ptr-ra a lock() metódussal. Ha az objektum már törölve lett, a lock() üres shared_ptr-t ad vissza.
    #include <memory>
    
    // shared_ptr létrehozása
    std::shared_ptr<int> sp = std::make_shared<int>(30);
    
    // weak_ptr létrehozása shared_ptr-ból
    std::weak_ptr<int> wp = sp;
    
    // Ellenőrzés és az objektum használata
    if (auto shared_from_weak = wp.lock()) {
        // Hozzáférés az objektumhoz a shared_from_weak segítségével
    } else {
        // Az objektum már törölve lett
    }