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
- Incluímos
<memory>para ter acesso astd::unique_ptrestd::make_unique. std::make_unique<int>(42)aloca umintcom valor 42 e retorna umunique_ptrque o possui.*pdesreferencia o ponteiro e obtém o valor 42, que é impresso.p.reset()destrói o objeto gerenciado e deixa o ponteiro vazio.- O operador
booldeunique_ptrretornafalsese 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. Usestd::movepara transferir posse. - Usar
papósresetsem verificar: desreferenciar umunique_ptrvazio é 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