web-dev-qa-db-fra.com

Pourquoi shared_from_this ne peut pas être utilisé dans le constructeur d'un point de vue technique?

Dans le livre La bibliothèque standard C++ à la page 91 J'ai lu ceci à propos de shared_from_this():

Le problème est que shared_ptr Se stocke dans un membre privé de la classe de base de Person, enable_shared_from_this<>, à la fin de la construction de la Personne.

L'extrait de code pertinent du livre est:

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

Je ne comprends pas deux choses ici:

  1. qui est ce shared_ptr qui se stocke?
  2. comment il peut se stocker n'importe où à la fin de la construction de Person? Je pense que la construction de Person se termine par la dernière déclaration de son constructeur qui a été écrite par moi.

Je comprends qu'il y a weak_ptr Qui n'a pas encore été initialisé.

EDIT: Merci à Angew! shared_from_this Ne fonctionnera qu'après la création de shared_ptr À Person. Ce shared_ptr Vérifiera si la classe Person a hérité de enable_shared_from_this, Et si oui, initialisez son weak_ptr Interne.

33
Yola

La raison est simple: dans l'objet X, enable_shared_from_this Fonctionne en initialisant un weak_ptr Caché avec une copie du premier shared_ptr Qui pointe vers l'objet X. Cependant, pour qu'un shared_ptr Puisse pointer vers X, X doit déjà exister (il doit déjà être construit). Par conséquent, pendant que le constructeur de X est en cours d'exécution, il n'y a pas encore de shared_ptr Que enable_shared_from_this Pourrait utiliser.

Prenez ce morceau de code:

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

Avant même d'appeler le constructeur de p (de shared_ptr), Son argument doit être évalué. Cet argument est l'expression new Person(). Par conséquent, le constructeur de Person s'exécute avant même que le constructeur de p ait commencé - avant qu'il n'y ait un objet shared_ptr Auquel enable_shared_from_this Pourrait se lier.

39
Angew