Sobes.tech
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_ptr mantém uma referência "fraca" ao objeto gerido por shared_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 um shared_ptr a partir do weak_ptr. Se o objeto ainda estiver vivo, lock() retornará um shared_ptr válido; caso contrário, retornará um shared_ptr vazio.
  • Sem acesso direto: weak_ptr nã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 a lock().

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.