Sobes.tech
Middle

Hoe werkt unique_ptr in C++?

sobes.tech AI

Antwoord van AI

std::unique_ptr — het een slimme pointer die het exclusieve eigendom van een dynamisch toegewezen object implementeert. Het zorgt voor automatisch geheugenbeheer: het object waarnaar unique_ptr wijst, wordt automatisch verwijderd bij vernietiging van unique_ptr.

Belangrijke kenmerken:

  • Exclusief eigendom: Op elk moment kan slechts één unique_ptr een bepaald object bezitten.
  • Geen kopiëren: unique_ptr kan niet worden gekopieerd. Dit voorkomt meervoudig eigendom van hetzelfde object en het probleem van "dubbel verwijderen".
  • Verplaatsingssemantiek: Het eigendom van het object kan worden overgedragen van de ene unique_ptr naar de andere met behulp van verplaatsingssemantiek (std::move).
  • Aanpasbare deleter: Je kunt een eigen deleter opgeven om specifieke manieren van resource vrijmaken te beheren.

Het werkingsprincipe is gebaseerd op RAII (Resource Acquisition Is Initialization): de resource (dynamisch toegewezen geheugen) wordt verworven bij het maken van het object (unique_ptr) en vrijgegeven bij vernietiging.

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

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

int main() {
    {   
        // Creëer een unique_ptr die een MyClass-object bezit
        std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(); 
        
        // Op dit moment is ptr1 de exclusieve eigenaar van het object
        // auto ptr2 = ptr1; // Fout: kopiëren is verboden

        // Eigendom overdragen van ptr1 naar ptr2
        std::unique_ptr<MyClass> ptr2 = std::move(ptr1); 
        
        // Na de verplaatsing bezit ptr1 geen object meer (is nullptr)
        if (!ptr1) {
            std::cout << "ptr1 bezit geen object: " << (ptr1 ? "Ja" : "Nee") << "\n";
        }

        // Het bereik van ptr2 eindigt hier.
        // ptr2 wordt vernietigd, en het MyClass-object dat het bezit, wordt automatisch verwijderd.
    } // Het MyClass-object wordt hier verwijderd

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

    return 0;
}

Vergelijking met raw pointer:

Kenmerk raw pointer std::unique_ptr
Eigendom van resource Niet gedefinieerd Exclusief
Automatisch verwijderen Nee Ja
Semantiek van kopiëren Ja Nee (alleen verplaatsen)
Risico op geheugenlek Hoog Laag

Over het algemeen is unique_ptr de voorkeursmethode voor het beheren van dynamisch geheugen in C++11 en hoger, vooral wanneer strikte eigendom en automatische vrijgave van resources vereist zijn.