Médio C++
Compartilhamento com shared_ptr
Enunciado
Crie um std::shared_ptr<std::string> com o valor "compartilhado". Faça uma cópia e imprima o use_count antes e depois de a cópia sair de escopo.
Requisitos
- Usar
std::make_shared<std::string>("compartilhado"). - Imprimir
use_count()com a cópia ativa (deve ser 2). - Imprimir
use_count()após a cópia ser destruída (deve ser 1).
Código inicial
#include <iostream>
#include <memory>
#include <string>
int main() {
// seu código aqui
return 0;
}
Saída esperada
use_count com copia: 2
use_count sem copia: 1
Ver dica
Coloque a cópia dentro de um bloco { } para que ela seja destruída ao final dele.
Mostrar solução
#include <iostream>
#include <memory>
#include <string>
int main() {
// Cria shared_ptr para string
auto sp = std::make_shared<std::string>("compartilhado");
{
auto copia = sp; // incrementa contador
std::cout << "use_count com copia: " << sp.use_count() << '\n';
} // copia destruida, contador decrementa
std::cout << "use_count sem copia: " << sp.use_count() << '\n';
return 0;
}
Passo a passo
std::make_shared<std::string>("compartilhado")aloca a string e cria umshared_ptrcom contador 1.- Dentro do bloco,
auto copia = sp;copia oshared_ptr, incrementando o contador para 2. sp.use_count()retorna 2, que é impresso.- Ao final do bloco,
copiaé destruída, decrementando o contador para 1. - Fora do bloco,
sp.use_count()retorna 1.
Por que funciona
O shared_ptr mantém um bloco de controle com o contador de referências. Cada cópia incrementa, cada destruição decrementa. Quando chega a zero, o objeto gerenciado é destruído.
Erros comuns
- Usar
newdiretamente:std::shared_ptr<std::string> sp(new std::string("..."));funciona, mas é menos eficiente e menos seguro quemake_shared. - Esquecer que
use_counté aproximado em ambientes multithread; não use para lógica de sincronização. - Criar dois
shared_ptrindependentes para o mesmo objeto bruto:auto p = new int; std::shared_ptr<int> a(p); std::shared_ptr<int> b(p);causa double free.
Outra forma de resolver
Poderia usar std::shared_ptr<std::string> sp = std::make_shared<std::string>("compartilhado"); sem auto, mas auto é mais idiomático.
Saída esperada
use_count com copia: 2
use_count sem copia: 1