web-dev-qa-db-fra.com

shared_ptr Assertion px! = 0 a échoué

J'ai une application (serveur) multithread assez complexe qui se bloque de temps en temps en raison d'une affirmation:

/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 n'ai pas pu identifier la cause et je me demandais si c'était un problème avec boost :: shared_ptr ou si c'était 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).

31
Horacio

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

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 conseillerais de les initialiser dès la déclaration si possible. La gestion des exceptions peut créer de nombreux 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 sont en cours d'utilisation conduisant 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.

36
jdehaan

vous voudrez peut-être vous assurer que vous

utilisez toujours une variable nommée de pointeur intelligent pour conserver le résultat de la nouvelle

comme il est recommandé ici: boost :: shared_ptr - Meilleures pratiques

Cordialement, Jonny

3
Jonny Dee

Voici pour faire revivre une ancienne question. Je viens de frapper ça, et c'était à cause d'un problème de timing. J'essayais d'utiliser le shared_ptr d'un thread avant d'avoir fini de l'initialiser dans un autre.

Donc, si quelqu'un frappe le message ci-dessus, vérifiez votre timing pour vous assurer que votre shared_ptr a été initialisé.

0
Joseph Larson