Middle
Qual ponteiro é usado junto com shared_ptr?
sobes.tech IA
Resposta da IA
weak_ptr.
#include <memory>
#include <iostream>
int main() {
auto shared = std::make_shared<int>(10); // Criar shared_ptr
std::weak_ptr<int> weak = shared; // Criar weak_ptr a partir do shared_ptr
if (auto locked = weak.lock()) { // Tentar obter um shared_ptr a partir do weak_ptr
std::cout << "Valor: " << *locked << std::endl;
} else {
std::cout << "Objeto eliminado." << std::endl;
}
shared.reset(); // O objeto apontado por shared_ptr é eliminado
if (auto locked = weak.lock()) { // Segunda tentativa, o objeto já foi eliminado
std::cout << "Valor: " << *locked << std::endl;
} else {
std::cout << "Objeto eliminado." << std::endl;
}
return 0;
}
weak_ptr junto com shared_ptr é usado para resolver problemas de referências cíclicas e prevenir "memory hang" quando dois ou mais objetos geridos por shared_ptr referenciam-se mutuamente, e os contadores de referências nunca atingem zero.
Aqui estão as principais propriedades de weak_ptr:
- Não aumenta o contador de referências:
weak_ptrmantém uma referência "fraca" ao objeto gerido porshared_ptr, sem aumentar o seu contador de referências fortes. - Verificação da vida do objeto: Com o método
lock(), pode-se tentar obter umshared_ptra partir doweak_ptr. Se o objeto ainda estiver vivo,lock()retornará umshared_ptrválido; caso contrário, retornará umshared_ptrvazio. - Sem acesso direto:
weak_ptrnão fornece acesso direto ao conteúdo do objeto através dos operadores*ou->. O acesso só é possível após uma chamada bem-sucedida alock().
O uso de weak_ptr é uma forma padrão de quebrar ciclos de referências em estruturas de dados que usam shared_ptr, como grafos ou listas duplamente ligadas.