weak_ptr smart shared_ptr pointer example create c++ constructor shared-ptr

c++ - smart - unique pointer



¿Por qué shared_from_this no se puede utilizar en el constructor desde el punto de vista técnico? (1)

En el libro The C ++ Standard Library en la página 91, he leído esto sobre shared_from_this() :

El problema es que shared_ptr almacena en un miembro privado de la clase base de la Person , enable_shared_from_this<> , al final de la construcción de la Persona.

El fragmento de código relevante del libro es:

class Person : public std::enable_shared_from_this<Person> { ... };

No entiendo dos cosas aquí:

  1. ¿Quién es este shared_ptr que se almacena solo?
  2. ¿cómo puede guardarse en cualquier lugar al final de la construcción de Person ? Creo que la construcción de Person termina con la última declaración de su constructor que escribí yo.

Entiendo que hay weak_ptr que aún no se ha inicializado.

EDITAR: ¡Gracias a Angew! shared_from_this solo funcionará después de que se haya creado la primera shared_ptr para Person . Este shared_ptr comprobará si la clase Person heredó de enable_shared_from_this , y si es así, inicializará su weak_ptr interno.


La razón es simple: en el objeto X , enable_shared_from_this funciona inicializando un weak_ptr oculto con una copia del primer shared_ptr que apunta al objeto X Sin embargo, para que un shared_ptr pueda apuntar a X , X ya debe existir (debe estar ya construido). Por lo tanto, mientras el constructor de X está ejecutando, todavía no hay shared_ptr que enable_shared_from_this pueda usar.

Toma este pedazo de código:

std::shared_ptr<Person> p(new Person());

Antes de que el constructor de p (del shared_ptr ) sea llamado, su argumento debe ser evaluado. Ese argumento es la expresión new Person() . Por lo tanto, el constructor de Person ejecuta antes de que el constructor de p haya comenzado, antes de que haya ningún objeto shared_ptr al que enable_shared_from_this pueda enlazarse.