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).
#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 p2std::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.
#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
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.
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
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.
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