Sobes.tech
Junior

Aké inteligentné ukazovatele (smart pointers) poznáte?

sobes.tech AI

Odpoveď od AI

std::unique_ptr, std::shared_ptr, std::weak_ptr, std::auto_ptr (zastarjelo u C++11 i uklonjeno u C++17).

  • std::unique_ptr: Ekskluzivno vlasništvo nad resursom. Resurs se oslobađa kada pokazivač izađe iz opsega ili se resetuje. Ne dozvoljava kopiranje, samo pomeranje.

    #include <memory>
    
    int main() {
        std::unique_ptr<int> ptr(new int(5));
        // std::unique_ptr<int> ptr2 = ptr; // Greška: ne kopira se
        std::unique_ptr<int> ptr3 = std::move(ptr); // Pomeranje
        return 0;
    }
    
  • std::shared_ptr: Zajedničko vlasništvo nad resursom. Koristi brojač referenci. Resurs se oslobađa kada poslednji shared_ptr koji ga ukazuje izađe iz opsega ili se resetuje. Podržava kopiranje.

    #include <memory>
    
    int main() {
        std::shared_ptr<int> ptr1(new int(10));
        std::shared_ptr<int> ptr2 = ptr1; // Kopiranje, brojač referenci se povećava
        return 0;
    }
    
  • std::weak_ptr: Ne poseduje resurs i ne povećava brojač referenci shared_ptr. Koristi se za sprečavanje cikličnih referenci između shared_ptr. Za pristup resursu potrebno je dobiti shared_ptr pomoću metode lock().

    #include <memory>
    
    int main() {
        std::shared_ptr<int> shared_ptr_inst(new int(20));
        std::weak_ptr<int> weak_ptr_inst = shared_ptr_inst; // Kreiranje weak_ptr
    
        if (auto locked_ptr = weak_ptr_inst.lock()) {
            // Uspešno dobijen shared_ptr, može se koristiti resurs
        } else {
            // Resurs je već oslobođen
        }
        return 0;
    }
    
  • std::auto_ptr: Zastareli pametni pokazivač sa semantikom vlasništva pri kopiranju, što je dovodilo do nejasnog ponašanja. Ne preporučuje se za korišćenje u novom kodu.

Razlike između shared_ptr i weak_ptr:

Osobina std::shared_ptr std::weak_ptr
Vlasništvo nad resursom Da Ne
Brojač referenci Povećava Ne povećava
Oslobađanje resursa Da, kada je brojač = 0 Ne
Ciklične reference Mogu izazvati Pomaže sprečiti
Pristup resursu Direktno operator*, operator-> Kroz metod lock()