Lecții din modul (1/2)
std::unique_ptr și std::shared_ptr
În C++ clasic, gestionarea manuală a memoriei folosind operatorii new și delete este o sursă comună de erori, cum ar fi scurgeri de memorie (resurse nu au fost lansate niciodată) sau pointeri suspendați (pointeri care indică către memoria dealocată).
C++ modern introduce Smart Pointers, definite în antetul <memory>. Aceștia gestionează automat ciclul de viață al memoriei alocate în heap folosind RAII (Resource Acquisition Is Initialization), dealocarea resursei atunci când pointerul inteligent iese din domeniul de aplicare.
std::unique_ptr
std::unique_ptr implementează conceptul de proprietate exclusivă a unei resurse. Nu poate fi copiat, ci doar mutat (prin 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 implementează conceptul de proprietate partajată. Mai multe indicatori inteligente pot indica aceeași resursă. Clasa menține în interior un număr de referințe: memoria este eliberată numai atunci când ultimul shared_ptr activ este distrus sau resetat.
#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)Încercați-l singur
Declarați un std::unique_ptr<int> numit ptr, inițialându-l cu std::make_unique menținând valoarea 42. Imprimați valoarea dereferențiată a ptr folosind std::cout.
Afișează indiciu
Utilizați `std::unique_ptr<int> ptr = std::make_unique<int>(42);` și apoi trimiteți `*ptr` în fluxul de ieșire.
Soluție disponibilă după 3 încercări
Instanciați un std::shared_ptr<int> numit ptr1 cu valoarea 100 folosind std::make_shared. Creați o copie numită ptr2 și imprimați valoarea returnată de ptr1.use_count() folosind std::cout.
Afișează indiciu
Copierea se face prin atribuire standard: `ptr2 = ptr1;`. Imprimarea `ptr1.use_count()` ar trebui să afișeze 2.
Soluție disponibilă după 3 încercări