AnyCompiler

Smart Pointers

Um unique_ptr possui um object alocado no heap exclusivamente — quando sai de scope, seu destructor automaticamente deleta o object que possui, apoiando-se diretamente no padrão RAII visto antes neste curso. make_unique cria um sem nunca escrever new ou delete à mão.

#include <iostream>
#include <memory>
using namespace std;

class Resource {
public:
    Resource() { cout << "Resource acquired" << endl; }
    ~Resource() { cout << "Resource released" << endl; }
    void use() { cout << "Using resource" << endl; }
};

int main() {
    unique_ptr<Resource> res = make_unique<Resource>();
    res->use();
    return 0;
}
Output
Resource acquired
Using resource
Resource released

shared_ptr

Um shared_ptr permite múltiplos owners do mesmo object, rastreando quantos shared_ptrs apontam para ele atualmente com uma contagem de referências. O object só é destruído quando essa contagem chega a zero — útil quando genuinamente não é possível ter um único owner claro.

#include <iostream>
#include <memory>
using namespace std;

int main() {
    shared_ptr<int> a = make_shared<int>(42);
    shared_ptr<int> b = a;
    cout << "value = " << *a << endl;
    cout << "use_count = " << a.use_count() << endl;
    return 0;
}
Output
value = 42
use_count = 2

O código C++ moderno recorre a unique_ptr e shared_ptr por padrão, e trata o new/delete bruto como último recurso — smart pointers te dão a mesma limpeza determinística que qualquer outro type RAII, sem que o programador precise lembrar de chamar delete manualmente.

A seguir: exceptions e tratamento de erros — try, catch, e throw.

Practice exercise

Use make_unique para criar um unique_ptr<int> contendo o valor 99, depois imprima o valor para o qual ele aponta.