Comment dupliquer correctement un objet donné son shared_ptr
Je suis en train de faire une copie d'un objet d'une classe personnalisée Event
. Je partage un pointeur vers l'objet que j'ai obtenu à partir de sa répartition:
std::shared_ptr<Event> e = std::make_shared<Event>();
Afin d'obtenir un véritable double de e
(et pas seulement une copie du pointeur) j'ai essayé:
std::shared_ptr<Event> o = std::make_shared<Event>(*e);
Mais je ne sais pas si c'est la bonne manière, il semble que si je supprime e
elle supprime également les o
...
Btw, je n'ai pas défini un constructeur de copie Event::Event(const Event &orig)
mais à mon sens ce n'est pas nécessaire que le compilateur fournit un défaut constructeur de copie. L'événement de la classe ne contient que des variables et pas d'autres pointeurs.
source d'informationauteur Marc
Vous devez vous connecter pour publier un commentaire.
std::make_shared
est juste un simple modèle de fonction qui crée les objets, en les passant tous les arguments du constructeur :Dans votre cas particulier :
l'objet est copié.
Si votre code est :
puis, bien sûr, les deux objets sont détruits, quand ils sortent de la portée.
Ce que vous avez essayé devrait fonctionner correctement, si le type dynamique de
*e
estEvent
et non pas une classe dérivée deEvent
. (Si*e
est en fait un objet dérivé deEvent
ensuite, vous allez créer un nouveauEvent
(pas le type dérivé) qu'une copie de la classe de base de la partie de*e
c'est à dire vous "tranche"*e
).Puisque vous créer
e
à l'aide demake_shared<Event>()
vous savez que, dans ce cas, il est vraiment unEvent
doncstd::make_shared<Event>(*e)
doit faire un nouvelshared_ptr
qui possède une copie de*e
.