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_ptralmacena en un miembro privado de la clase base de laPerson,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í:
- ¿Quién es este
shared_ptrque se almacena solo? - ¿cómo puede guardarse en cualquier lugar al final de la construcción de
Person? Creo que la construcción dePersontermina 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.