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).
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.
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
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é.