2010-10-06 6 views
0

J'utilise le framework ACE, mais je vais essayer de décrire mon problème sans y faire référence.shared_ptr puzzle

J'ai un gestionnaire d'événements (classe dérivée de ACE_Event_Handler). La référence au gestionnaire d'événements est conservée par une classe de gestionnaire dans les mappes de shared_ptr.

À un certain moment je veux:

  1. supprimer le gestionnaire d'événements de carte du gestionnaire
  2. une méthode de gestionnaire d'événements doit être appelé par le 3e classe qui détient le pointeur de ligne au gestionnaire d'événements (pour ceux qui sont familiers avec ACE c'est handle_close() appelé par ACE Reactor)

Le problème est que l'ordre (1) et (2) n'est pas promis. Si (1) est appelé avant (2), (2) fonctionnera sur le gestionnaire d'événement suspendu. J'ai donc pensé à ajouter une référence supplémentaire au gestionnaire d'événements qui sera décrémentée dans (2).

Comment cela peut-il être fait? La référence au gestionnaire d'événements peut-elle être gérée depuis le gestionnaire d'événements lui-même (probablement en utilisant enable_shared_from_this)?

Merci

Répondre

1

Holding a pointeur partagé à lui-même dans la variable membre vaincra fin de shared_ptr, parce que vous devrez informer un objet de façon à ce sujet, il ne faut plus (ce que « supprimer obj » pour, que nous essayons d'éviter d'utiliser des pointeurs intelligents).
Comme l'une des solutions: remplacer le pointeur brut en 3ème classe par shared_ptr (ou weak_ptr) si c'est possible. D'autres solutions dépendent fortement de la conception de votre application, par exemple vous pouvez en quelque sorte forcer l'ordre pour supprimer les pointeurs du gestionnaire ...
Essayez d'enquêter sur ce document http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/sp_techniques.html, peut-être que vous trouverez quelque chose utile pour vous.

+0

+1 merci pour le lien. Je suis entièrement d'accord avec vos suggestions. Hovewer ils ne sont pas applicables dans ma situation. – dimba