Salt la conținutul principal
Modulul 7 · Lecția 1 din 215/18 în curs~12 min
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).

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 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.

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)

Încercați-l singur

Exercițiu#cpp.m7.l1.e1
Încercări: 0Se încarcă…

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.

Se încarcă editorul...
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

Exercițiu#cpp.m7.l1.e2
Încercări: 0Se încarcă…

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.

Se încarcă editorul...
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