Fácil C++

Criando e usando unique_ptr

Enunciado

Crie um std::unique_ptr para um int com valor 42 usando std::make_unique. Imprima o valor e depois libere o ponteiro com reset().

Requisitos

  • Usar std::make_unique<int>(42).
  • Imprimir o valor apontado antes do reset.
  • Chamar reset() e verificar que o ponteiro ficou nulo.

Código inicial

#include <iostream>
#include <memory>

int main() {
    // seu código aqui
    return 0;
}

Saída esperada

Valor: 42
Ponteiro nulo apos reset: 1
Ver dica

unique_ptr tem operador bool que indica se ele possui um objeto. Após reset(), ele fica vazio.

Mostrar solução
#include <iostream>
#include <memory>

int main() {
    // Cria unique_ptr para int com valor 42
    auto p = std::make_unique<int>(42);
    std::cout << "Valor: " << *p << '\n';

    p.reset(); // libera o objeto
    std::cout << "Ponteiro nulo apos reset: " << (p ? 0 : 1) << '\n';
    return 0;
}

Passo a passo

  1. Incluímos <memory> para ter acesso a std::unique_ptr e std::make_unique.
  2. std::make_unique<int>(42) aloca um int com valor 42 e retorna um unique_ptr que o possui.
  3. *p desreferencia o ponteiro e obtém o valor 42, que é impresso.
  4. p.reset() destrói o objeto gerenciado e deixa o ponteiro vazio.
  5. O operador bool de unique_ptr retorna false se não há objeto, então (p ? 0 : 1) resulta em 1.

Por que funciona

O unique_ptr é um wrapper RAII: ao ser destruído ou sofrer reset, ele automaticamente chama delete no objeto. Isso elimina a necessidade de gerenciamento manual e evita vazamentos.

Erros comuns

  • Esquecer de incluir <memory>: erro de compilação 'unique_ptr' is not a member of 'std'.
  • Tentar copiar um unique_ptr: auto q = p; gera erro porque o construtor de cópia é deletado. Use std::move para transferir posse.
  • Usar p após reset sem verificar: desreferenciar um unique_ptr vazio é comportamento indefinido.

Outra forma de resolver

Poderia usar std::unique_ptr<int> p(new int(42));, mas make_unique é mais seguro e conciso.

Saída esperada

Valor: 42
Ponteiro nulo apos reset: 1