2010-08-22 4 views
29

J'ai une application multithread assez complexe (serveur) que de temps en temps se crasher à cause d'une assertion:shared_ptr Assertion px = 0 a échoué

/usr/include/boost/smart_ptr/shared_ptr.hpp:418: T* boost::shared_ptr< <template-parameter-1-1> >::operator->() const [with T = msg::Player]: Assertion `px != 0' failed. 

Je suis incapable de déterminer la cause et était Je me demande si c'est un problème avec boost :: shared_ptr ou c'est moi?

J'ai essayé g ++ 4.4.3-4ubuntu5 et llvm-g ++ (GCC) 4.2.1 avec optimisation et sans optimisation et libboost1.40-dev (= 1.40.0-4ubuntu4).

+1

Les bogues multithread sont difficiles à localiser. Puisque vous êtes sur linux, il n'y a aucune raison de ne pas utiliser valgrind - cela vous aidera à trouver le bogue. – nos

+0

J'utilise valgrind intensivement et je reçois zéro erreur (avec memcheck) jusqu'à ce que l'affirmation se produise. J'apprends toujours comment interpréter les messages d'erreur drd comme la plupart d'entre eux (conflit charge/stocker sur les types booléens/entiers) ne semblent pas un problème. – Horacio

Répondre

33

L'utilisation de boost::shared_ptr ne devrait poser aucun problème tant que vous initialisez correctement vos pointeurs partagés et que vous utilisez le même contexte de gestion de la mémoire pour toutes vos bibliothèques d'objets partagés.

Dans votre cas, vous essayez d'utiliser un pointeur partagé non initialisé.

boost::shared_ptr<Obj> obj; 
obj->Something(); // assertion failed 

boost::shared_ptr<Obj> obj(new Obj); 
obj->Something(); // ok 

Je vous conseille de les initialiser dès que possible. La gestion des exceptions peut créer un grand nombre de chemins "invisibles" pour l'exécution du code et il peut être assez difficile d'identifier les pointeurs partagés non initialisés. PS: Il y a d'autres problèmes si vous chargez/déchargez des modules où shared_ptr est utilisé, ce qui mène au chaos. C'est très difficile à résoudre mais dans ce cas vous auriez un pointeur non nul. Ce n'est pas ce qui vous arrive en ce moment.

3

vous pourriez vouloir vous assurer que vous

toujours utiliser une variable de pointeur intelligent nommé pour tenir le résultat d'une nouvelle

comme il est recommandé ici: boost::shared_ptr - Best Practices

Cordialement, Jonny