shared_ptr <> es a weak_ptr <> como unique_ptr <> es a ... ¿qué?
En C ++ 11, puedes usar unshared_ptr<>
establecer una relación de propiedad con un objeto o variable yweak_ptr<>
para hacer referencia segura a ese objeto de una manera no propia.
También puedes usarunique_ptr<>
Establecer una relación de propiedad con un objeto o variable. Pero, ¿qué pasa si otros objetos que no son propietarios también quieren hacer referencia a ese objeto?weak_ptr<>
no es útil en este caso Los punteros sin procesar son útiles, pero traen varias desventajas (por ejemplo, pueden serSe inicializa automáticamente a nullptr pero esto se logra a través de técnicas que no son consistentes con elstd::*_ptr<>
tipos).
¿Cuál es el equivalente deweak_ptr<>
para referencias no propietarias a objetos de propiedad a través deunique_ptr<>
?
Aquí hay un ejemplo de clarificación que se parece a algo en un juego en el que estoy trabajando.
class World
{
public:
Trebuchet* trebuchet() const { return m_trebuchet.get(); }
private:
std::unique_ptr< Trebuchet > m_trebuchet;
};
class Victim
{
public:
Victim( Trebuchet* theTrebuchet ) : m_trebuchet( theTrebuchet ) {}
~Victim()
{
delete m_trebuchet; // Duh. Oops. Dumb error. Nice if the compiler helped prevent this.
}
private:
Trebuchet* m_trebuchet; // Non-owning.
};
shared_ptr< Victim > createVictim( World& world )
{
return make_shared< Victim >( world.trebuchet() );
}
Aquí utilizamos un puntero en bruto para mantener una relación no propietaria con un objeto de propiedad a través deunique_ptr<>
en otra parte. Pero es crudo lo mejor que podemos hacer?
La esperanza es un tipo de puntero que:
Parece que los otros tipos de punteros modernos. P.ej.std::raw_ptr<T>
.Reemplaza los punteros sin formato para que pueda encontrar una base de código que use tipos de punteros modernos en todotodos punteros a través de una búsqueda de_ptr<
(aproximadamente).Se inicializa automáticamente a nullptr.Así:
int* p; // Unknown value.
std::raw_ptr< int > p; // null.
¿Este tipo ya existe en C ++ ahora, se propone para el futuro o es otra implementación ampliamente disponible en, por ejemplo, ¿Aumentar?