Question

J'utilise des pointeurs Boost / shared_ptr tout au long de ma demande. Lorsque la dernière référence à un objet est libéré, shared_ptr supprimera l'objet pour moi. Les objets de l'application abonnée à des événements dans un emplacement central de l'application, similaire à l'observateur / motif d'abonné.

Dans les Destructeurs d'objet, l'objet se désabonner de la liste des abonnements. La liste des abonnements est essentiellement juste un list<weak_ptr<MyObject> >. Ce que je veux faire quelque chose de similaire à ceci:

Type::~Type()
{
  Subscriptions::Instance()->Remove(shared_from_this());
}

est mon problème ici que shared_from_this ne peuvent pas être appelées dans le code afin Destructeurs ci-dessus lancera une exception.

Dans mon ancienne implémentation, la liste des abonnés était juste une liste de pointeurs et cela a fonctionné. Mais je veux utiliser weak_ptr références au lieu de réduire le risque de me vissage de la mémoire par la gestion de la mémoire manuelle.

Depuis que je compte sur shared_ptr à faire la suppression des objets, il n'y a pas de place unique dans mon code où je peux logiquement un appel à désabonner.

Toutes les idées sur ce qu'il faut faire dans cette situation?

Était-ce utile?

La solution

  1. Vous pouvez détruire les objets par exemple d'abonnement, il va supprimer automatiquement les pointeurs.
  2. Vous pouvez oublier les retirer des abonnements -. La coutume du weak_ptr pouvoir être verrouillé de toute façon, vous pouvez les supprimer
  3. Vous pouvez attribuer un identifiant unique à chaque objet, puis retirer via l'ID unique pas shared_ptr
  4. Vous pouvez passer un pointeur normal pour supprimer au lieu d'un partage un - il servira comme un « ID ».

Autres conseils

  

Mon problème ici est que shared_from_this ne peut pas être appelé   Destructeurs de sorte que le code ci-dessus jetteront une exception.

Il lancera une exception parce qu'il est arrivé à expiration , par définition, dans un destructor.

Alors, que voulez-vous de toute façon? Un "expiré" pointeur partagé? Il suffit de créer un pointeur partagé vide.

ou un pointeur faible expiré?

Peut-être que si vous remarquez que l'est shared_from_this pas lancer « problème » (c'est un symptôme) mais tous les propriétaires étant par nature déjà réinitialiser ou détruits à ce moment-là et les pointeurs faibles étant expiré et équivalent à un défaut vide créé pointeur faible (*), de sorte que vous venez de passer un défaut doit initialiser le pointeur faible.

En outre Subscriptions::Instance()->Remove(weak_OR_owning_pointer) n'a pas de sens de toute façon (soit avec pointeur faible ou posséder) que vous ne pouvez pas comparer un pointeur faible pour quoi que ce soit, vous ne pouvez essayer de le verrouiller (puis faire une comparaison).

Vous pouvez simplement supprimer des pointeurs faibles expirés. Les arguments de Remove est inutile.

(*) soit que ou que vous avez un double bug très sérieux de la double propriété de l'objet détruit!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top