Sobes.tech
Junior

Aké sú inteligentné ukazovatele v C++?

sobes.tech AI

Odpoveď od AI

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

  • std::unique_ptr:

    • Výhradné vlastníctvo objektu.
    • Nemôže byť kopírovaný, ale môže byť presunutý (std::move).
    • Automaticky odstráni objekt pri opustení rozsahu alebo zničení unique_ptr.
    • Je ľahký, bez dodatočných nákladov na čítač odkazov.
    #include <memory>
    
    // Vytvorenie unique_ptr
    std::unique_ptr<int> up1(new int(10));
    
    // Presun vlastníctva
    std::unique_ptr<int> up2 = std::move(up1);
    
    // up1 je teraz nullptr
    // up2 vlastní objekt
    
  • std::shared_ptr:

    • Zdieľané vlastníctvo objektu.
    • Používa čítač odkazov na sledovanie, koľko shared_ptr ukazuje na zdroj.
    • Objekt je odstránený, keď posledný shared_ptr, ktorý naň odkazuje, je zničený.
    • Môže byť kopírovaný a presunutý.
    • Má dodatočné náklady na čítač odkazov (zvyčajne samostatne alokovaný).
    • Môže tvoriť cyklické odkazy, čo vedie k únikom pamäte.
    #include <memory>
    
    // Vytvorenie shared_ptr
    std::shared_ptr<int> sp1 = std::make_shared<int>(20);
    
    // Kopírovanie vlastníctva
    std::shared_ptr<int> sp2 = sp1; // Čítač odkazov sa zvyšuje
    
    // sp1 a sp2 vlastnia objekt
    
  • std::weak_ptr:

    • Nevlastní objekt.
    • Predstavuje "slabú" referenciu na objekt, spravovanú jedným alebo viacerými shared_ptr.
    • Používa sa na prevenciu cyklických odkazov medzi shared_ptr.
    • Nezvyšuje čítač odkazov objektu.
    • Pre bezpečný prístup k objektu je potrebné ho konvertovať na shared_ptr pomocou metódy lock(). Ak bol objekt už odstránený, lock() vráti prázdny shared_ptr.
    #include <memory>
    
    // Vytvorenie shared_ptr
    std::shared_ptr<int> sp = std::make_shared<int>(30);
    
    // Vytvorenie weak_ptr z shared_ptr
    std::weak_ptr<int> wp = sp;
    
    // Kontrola a použitie objektu
    if (auto shared_from_weak = wp.lock()) {
        // Prístup k objektu cez shared_from_weak
    } else {
        // Objekt už bol odstránený
    }