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 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_ptr
que se almacena solo? - ¿cómo puede guardarse en cualquier lugar al final de la construcción de
Person
? Creo que la construcción dePerson
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.