Direct naar de hoofdinhoud
Module 7 · Les 1 van 215/18 in de cursus~12 min
Modulelessen (1/2)

std::unique_ptr en std::shared_ptr

In klassiek C++ is handmatig geheugenbeheer met behulp van de operatoren new en delete een veel voorkomende bron van bugs, zoals geheugenlekken (bronnen die nooit zijn vrijgegeven) of bungelende verwijzingen (aanwijzers die verwijzen naar niet-toegewezen geheugen).

Modern C++ introduceert Smart Pointers, gedefinieerd in de header <memory>. Ze beheren automatisch de levenscyclus van heap-allocated geheugen met behulp van RAII (Resource Acquisition Is Initialization), waarbij de toewijzing van de bron ongedaan wordt gemaakt wanneer de slimme aanwijzer buiten bereik raakt.

std::unique_ptr

std::unique_ptr implementeert het concept van exclusief eigendom van een bron. Het kan niet worden gekopieerd, alleen verplaatst (via std::move).

C++
#include <memory>

// Recommended creation using std::make_unique (C++14)
std::unique_ptr<int> p1 = std::make_unique<int>(42);

// Accessing the resource like a normal pointer
std::cout << *p1 << std::endl;

// std::unique_ptr<int> p2 = p1; // COMPILER ERROR: copy not allowed!
std::unique_ptr<int> p2 = std::move(p1); // Allowed: p1 transfers ownership to p2

std::shared_ptr

std::shared_ptr implementeert het concept van gedeeld eigendom. Meerdere slimme pointers kunnen naar dezelfde bron verwijzen. De klasse houdt intern een referentietelling bij: het geheugen wordt alleen vrijgegeven wanneer de laatste actieve shared_ptr wordt vernietigd of gereset.

C++
#include <memory>

std::shared_ptr<int> s1 = std::make_shared<int>(100);
std::shared_ptr<int> s2 = s1; // Allowed: increments the reference count

std::cout << s1.use_count() << std::endl; // Prints 2 (s1 and s2 share the resource)

Probeer het zelf

Oefening#cpp.m7.l1.e1
Pogingen: 0Laden…

Declareer een std::unique_ptr<int> met de naam ptr, en initialiseer deze met std::make_unique met de waarde 42. Druk de gederefereerde waarde van ptr af met behulp van std::cout.

Editor laden…
Toon hint

Gebruik `std::unique_ptr<int> ptr = std::make_unique<int>(42);` en stuur vervolgens `*ptr` naar de uitvoerstroom.

Oplossing beschikbaar na 3 pogingen

Oefening#cpp.m7.l1.e2
Pogingen: 0Laden…

Instantieer een std::shared_ptr<int> met de naam ptr1 met de waarde 100 met behulp van std::make_shared. Maak een kopie met de naam ptr2 en druk de waarde af die wordt geretourneerd door ptr1.use_count() met behulp van std::cout.

Editor laden…
Toon hint

Kopiëren gebeurt via standaardtoewijzing: `ptr2 = ptr1;`. Bij het afdrukken van `ptr1.use_count()` zou 2 moeten worden weergegeven.

Oplossing beschikbaar na 3 pogingen