Sobes.tech
Middle

Jak funguje unique_ptr v C++?

sobes.tech AI

Odpověď od AI

std::unique_ptr — je chytrý ukazatel, který implementuje výlučné vlastnictví dynamicky alokovaného objektu. Zajišťuje automatické řízení paměti: objekt, na který ukazuje unique_ptr, je automaticky odstraněn při zničení unique_ptr.

Klíčové vlastnosti:

  • Výlučné vlastnictví: V jakémkoli okamžiku může vlastnit konkrétní objekt pouze jeden unique_ptr.
  • Nepodporuje kopírování: unique_ptr nelze kopírovat. To zabraňuje vícenásobnému vlastnictví téhož objektu a problému "dvojitého odstranění".
  • Semantika přesunu: Vlastnictví objektu může být předáno z jednoho unique_ptr na jiný pomocí semantics přesunu (std::move).
  • Nastavitelný mazáček: Může být poskytnut vlastní mazáček (deleter) pro správu specifických způsobů uvolnění zdrojů.

Princip fungování je založen na RAII (Resource Acquisition Is Initialization): zdroj (dynamicky alokovaná paměť) je získán při vytvoření objektu (unique_ptr) a uvolněn při zničení tohoto objektu.

#include <memory> // Pro unique_ptr
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "MyClass created\n"; }
    ~MyClass() { std::cout << "MyClass destroyed\n"; }
};

int main() {
    {   
        // Vytvoření unique_ptr, který vlastní objekt MyClass
        std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(); 
        
        // V tuto chvíli je ptr1 výlučným vlastníkem objektu
        // auto ptr2 = ptr1; // Chyba kompilace: kopírování je zakázáno

        // Předání vlastnictví z ptr1 na ptr2
        std::unique_ptr<MyClass> ptr2 = std::move(ptr1); 
        
        // Po přesunu již ptr1 nevlastní objekt (stal se nullptr)
        if (!ptr1) {
            std::cout << "ptr1 vlastní objekt: " << (ptr1 ? "Ano" : "Ne") << "\n";
        }

        // Oblast platnosti pro ptr2 končí.
        // ptr2 je zničeno a objekt MyClass, který vlastní, je automaticky odstraněn.
    } // Objekt MyClass je zničen zde

    std::cout << "Konec main.\n";

    return 0;
}

Porovnání s raw pointer:

Charakteristika raw pointer std::unique_ptr
Vlastnictví zdroje Není určeno Výlučné
Automatické odstranění Ne Ano
Semantika kopírování Ano Ne (pouze přesun)
Úniky paměti Vysoké riziko Nízké riziko

Celkově je unique_ptr preferovaným způsobem řízení dynamické paměti v C++11 a vyšších verzích pro případy, kdy je vyžadováno přísné vlastnictví a automatické uvolnění zdrojů.