Sobes.tech
Junior
225

Welke slimme pointers zijn er in C++?

Antwoord van AI

sobes.tech AI

std::unique_ptr, std::shared_ptr, std::weak_ptr.

  • std::unique_ptr:

    • Exclusief eigendom van het object.
    • Kan niet worden gekopieerd, maar kan worden verplaatst (std::move).
    • Verwijdert automatisch het object bij het verlaten van de scope of bij vernietiging van unique_ptr.
    • Is lichtgewicht, zonder extra kosten voor de referentieteller.
    #include <memory>
    
    // Creëren van een unique_ptr
    std::unique_ptr<int> up1(new int(10));
    
    // Eigendom verplaatsen
    std::unique_ptr<int> up2 = std::move(up1);
    
    // up1 is nu nullptr
    // up2 bezit het object
    
  • std::shared_ptr:

    • Gedeeld eigendom van het object.
    • Gebruikt een referentieteller om bij te houden hoeveel shared_ptr naar de bron wijzen.
    • Het object wordt verwijderd wanneer de laatste shared_ptr die ernaar wijst wordt vernietigd.
    • Kan worden gekopieerd en verplaatst.
    • Heeft extra kosten voor de referentieteller (meestal apart gealloceerd).
    • Kan cyclische referenties vormen, wat leidt tot geheugenlekken.
    #include <memory>
    
    // Creëren van een shared_ptr
    std::shared_ptr<int> sp1 = std::make_shared<int>(20);
    
    // Kopiëren van eigendom
    std::shared_ptr<int> sp2 = sp1; // Referentieteller wordt verhoogd
    
    // sp1 en sp2 bezitten het object
    
  • std::weak_ptr:

    • Bezit het object niet.
    • Vertegenwoordigt een "zwakke" verwijzing naar het object, beheerd door één of meerdere shared_ptr.
    • Wordt gebruikt om cyclische referenties tussen shared_ptr te voorkomen.
    • Verhoogt de referentieteller niet.
    • Om veilig toegang te krijgen tot het object, moet het worden geconverteerd naar shared_ptr met behulp van de lock()-methode. Als het object al is verwijderd, geeft lock() een lege shared_ptr terug.
    #include <memory>
    
    // Creëren van een shared_ptr
    std::shared_ptr<int> sp = std::make_shared<int>(30);
    
    // Creëren van een weak_ptr uit een shared_ptr
    std::weak_ptr<int> wp = sp;
    
    // Controle en gebruik van het object
    if (auto shared_from_weak = wp.lock()) {
        // Toegang tot het object via shared_from_weak
    } else {
        // Het object is al verwijderd
    }