Maison > développement back-end > C++ > Pourquoi ne pouvez-vous pas utiliser `shared_from_this()` dans les constructeurs ?

Pourquoi ne pouvez-vous pas utiliser `shared_from_this()` dans les constructeurs ?

Mary-Kate Olsen
Libérer: 2024-11-06 15:35:02
original
545 Les gens l'ont consulté

Why Can't You Use `shared_from_this()` in Constructors?

Comprendre les limites de shared_from_this dans les constructeurs

Comme indiqué dans l'extrait de « La bibliothèque standard C », shared_from_this() est confronté à un problème technique limitation au sein des constructeurs. Pour comprendre ce concept, il est essentiel de se plonger dans le fonctionnement interne de shared_from_this().

Le rôle des pointeurs faibles dans shared_from_this

shared_from_this() repose sur un système interne faible_ptr pour conserver une référence faible à l'objet créé. Ce pointeur faible reste non initialisé jusqu'à ce qu'un shared_ptr fort (un shared_ptr propriétaire de l'objet) soit créé pour l'objet. Ce n'est qu'après l'instanciation du premier shared_ptr que l'enable_shared_from_this, une classe de base de l'objet, peut accéder à ce shared_ptr et initialiser le low_ptr.

Le problème du timing de construction

Cette dépendance sur shared_ptrs existant pose un problème pour les constructeurs. Lorsqu'un constructeur est invoqué, aucun shared_ptr pointant vers l'objet en cours de construction n'existe encore. Par conséquent, pendant la construction, activate_shared_from_this ne peut pas initialiser son faible_ptr, ce qui rend shared_from_this() inutilisable dans le constructeur.

Un exemple de clarification

Considérez l'extrait de code suivant :

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

std::shared_ptr<Person> p(new Person());
Copier après la connexion

Dans cet exemple, le constructeur de Person() s'exécute avant le constructeur du shared_ptr p. Cela signifie que pendant le constructeur Person(), aucun shared_ptr pointant vers l'objet Person n'existe, interdisant à enable_shared_from_this d'initialiser son low_ptr et rendant shared_from_this() inaccessible dans le constructeur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal