2009-01-20 7 views

Répondre

17

C++ n'a pas de protection intrinsèque contre l'utilisation d'un objet après sa suppression - oubliez les conditions de course - un autre thread pourrait utiliser votre objet après qu'il ait été complètement supprimé.

Soit:

  1. Assurez-vous qu'un seul endroit dans le code propriétaire de l'objet, et il est responsable de la suppression quand personne ne est d'utiliser l'objet.
  2. Faire la référence d'objet compté - le code de comptage de référence explicite ajouté ou trouver une classe de base appropriée qui implémente référence comptage
+0

Un bon indice utiliserait 'boost :: shared_ptr <>' pour ref-counting. Il prend également en charge des constructions telles que 'weak_ptr <>' ou 'enable_shared_from_this', ce qui rend assez facile la gestion de toute une vie. – gimpf

+0

Malheureusement, suivre l'un ou l'autre conseil n'est pas suffisant pour éviter les courses de données potentielles. Imaginez: le thread A crée l'objet et transmet une référence au thread B. Sur B, une fonction de membre en mutation est appelée. Plus tard, A détruit l'objet qui nécessite d'accéder à la variable membre. – CouchDeveloper

15

Vous ne devriez pas détruire un objet sauf si vous êtes sûr que rien d'autre n'essaiera de l'utiliser - idéalement, rien d'autre ne s'y réfèrera. Vous aurez besoin de regarder de plus près lorsque vous appelez supprimer.

+0

Parfait, réponse simple. Pris plus loin, non seulement cela peut se produire à l'intérieur du destructeur, cela peut arriver après que vous ayez quitté le destructeur. La langue ne peut pas corriger le mauvais design. –

+0

Merci. Je devrais cependant suggérer que la réponse de Douglas Leeder est plus complète que la mienne. – DJClayworth

2

Dans le cas êtes-vous dans un destructor en raison de la pile déroulage en exception Gestionnaire, je suggère de réorganiser votre code de telle sorte que vous piègez les exceptions dans un bloc sérialisé. Après le bloc, vous vérifiez si l'objet est toujours valide et appelez votre méthode. De cette façon, l'exception dans un thread, permettra aux autres threads de gérer l'appel au destructeur avec élégance.

+0

Si votre objet est partagé par plusieurs threads, une exception ne doit pas déclencher sa destruction. – Eclipse

Questions connexes