Sobes.tech
Middle

Kako funkcioniše unique_ptr u C++?

sobes.tech АИ

Одговор од АИ

std::unique_ptr — to je pametna pokazivač koja implementira isključivo vlasništvo nad dinamički alociranim objektom. Osigurava automatsko upravljanje memorijom: objekat na koji ukazuje unique_ptr automatski se briše pri uništenju unique_ptr.

Ključne osobine:

  • Isključivo vlasništvo: U bilo kom trenutku, samo jedan unique_ptr može posedovati određeni objekat.
  • Nepostojanje kopiranja: unique_ptr se ne može kopirati. To sprečava višestruko vlasništvo nad istim objektom i problem "duplog brisanja".
  • Semantika pomeranja: Vlasništvo nad objektom može biti preneto sa jednog unique_ptr na drugi pomoću semantike pomeranja (std::move).
  • Prilagodljiv brisač: Može se pružiti sopstveni brisač (deleter) za upravljanje specifičnim načinima oslobađanja resursa.

Princip rada zasniva se na RAII (Resource Acquisition Is Initialization): resurs (dinamički alocirana memorija) se stiče pri kreiranju objekta (unique_ptr) i oslobađa pri uništenju objekta.

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

class MyClass {
public:
    MyClass() { std::cout << "MyClass kreiran\n"; }
    ~MyClass() { std::cout << "MyClass uništen\n"; }
};

int main() {
    {   
        // Kreiranje unique_ptr koji poseduje objekat MyClass
        std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(); 
        
        // U ovom trenutku, ptr1 je isključivi vlasnik objekta
        // auto ptr2 = ptr1; // Greška pri kompilaciji: kopiranje je zabranjeno

        // Prenos vlasništva sa ptr1 na ptr2
        std::unique_ptr<MyClass> ptr2 = std::move(ptr1); 
        
        // Nakon prenosa, ptr1 više ne poseduje objekat (postao je nullptr)
        if (!ptr1) {
            std::cout << "ptr1 ne poseduje objekat: " << (ptr1 ? "Da" : "Ne") << "\n";
        }

        // Obuhvat za ptr2 završava.
        // ptr2 se uništava, a objekat MyClass koji poseduje automatski se briše.
    } // Objekat MyClass se uništava ovde

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

    return 0;
}

Upoređenje sa raw pointer:

Karakteristika raw pointer std::unique_ptr
Vlasništvo nad resursom Nije definisano Isključivo
Automatsko brisanje Ne Da
Semantika kopiranja Da Ne (samo pomeranje)
Rizik od curenja memorije Visok Nizak

U celini, unique_ptr je preferirani način upravljanja dinamičkom memorijom u C++11 i novijim verzijama za slučajeve kada je potrebno strogo vlasništvo i automatsko oslobađanje resursa.