Sobes.tech
Middle

Ako funguje unique_ptr v C++?

sobes.tech AI

Odpoveď od AI

std::unique_ptr — je inteligentný ukazovateľ, ktorý implementuje výlučné vlastníctvo nad dynamicky alokovaným objektom. Zabezpečuje automatické riadenie pamäte: objekt, na ktorý ukazuje unique_ptr, sa automaticky odstráni pri zničení unique_ptr.

Kľúčové vlastnosti:

  • Výlučné vlastníctvo: V akomkoľvek momente môže vlastniť konkrétny objekt iba jeden unique_ptr.
  • Nepodporuje kopírovanie: unique_ptr nemôže byť kopírovaný. To zabraňuje viacerému vlastníctvu toho istého objektu a problému "dvojitého odstránenia".
  • Semantika presunu: Vlastníctvo objektu môže byť prevedené z jedného unique_ptr na iný pomocou semantics presunu (std::move).
  • Nastaviteľný mazač: Môže byť poskytnutý vlastný mazač (deleter) na správu špecifických spôsobov uvoľnenia zdrojov.

Princíp fungovania je založený na RAII (Resource Acquisition Is Initialization): zdroj (dynamicky alokovaná pamäť) sa nadobúda pri vytvorení objektu (unique_ptr) a uvoľňuje sa pri zničení tohto objektu.

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

class MyClass {
public:
    MyClass() { std::cout << "MyClass vytvorený\n"; }
    ~MyClass() { std::cout << "MyClass zničený\n"; }
};

int main() {
    {   
        // Vytvorenie unique_ptr, ktorý vlastní objekt MyClass
        std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(); 
        
        // V tomto momente je ptr1 výlučným vlastníkom objektu
        // auto ptr2 = ptr1; // Chyba kompilácie: kopírovanie je zakázané

        // Presun vlastníctva z ptr1 na ptr2
        std::unique_ptr<MyClass> ptr2 = std::move(ptr1); 
        
        // Po presune už ptr1 ne vlastní objekt (stal sa nullptr)
        if (!ptr1) {
            std::cout << "ptr1 ne vlastní objekt: " << (ptr1 ? "Áno" : "Nie") << "\n";
        }

        // Oblasť platnosti pre ptr2 končí.
        // ptr2 sa zničí a objekt MyClass, ktorý vlastní, sa automaticky odstráni.
    } // Objekt MyClass sa zničí tu

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

    return 0;
}

Porovnanie s raw pointer:

Charakteristika raw pointer std::unique_ptr
Vlastníctvo zdroja Nie je definované Výlučné
Automatické odstránenie Nie Áno
Semantika kopírovania Áno Nie (len presun)
Úniky pamäte Vysoké riziko Nízke riziko

Celkovo je unique_ptr preferovaným spôsobom riadenia dynamickej pamäte v C++11 a vyšších verziách pre prípady, keď je požadované prísne vlastníctvo a automatické uvoľnenie zdrojov.