aserción ptr compartida px!= 0 falló


Tengo una aplicación multihilo bastante compleja (servidor) que de vez en cuando se bloqueará debido a una afirmación:

/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.

No he podido identificar la causa y me preguntaba si esto es un problema con boost::shared_ptr o si soy yo?

Probé g++ 4.4.3-4ubuntu5 y llvm-g++ (GCC) 4.2.1 con optimización y sin optimización y libboost1.40-dev (= 1.40.0-4ubuntu4).

Author: Horacio, 2010-08-22

2 answers

No debería haber ningún problema con el uso de boost::shared_ptr siempre y cuando inicialice sus punteros compartidos correctamente y use el mismo contexto de administración de memoria para todas sus bibliotecas de objetos compartidos.

En su caso está tratando de usar un puntero compartido no iniciado.

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

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

Aconsejaría inicializarlos en el momento de la declaración siempre que sea posible. El manejo de excepciones puede crear una gran cantidad de rutas "invisibles" para que el código se ejecute y puede ser bastante difícil identificar punteros compartidos inicializados.

PD: Hay otros problemas si carga/descarga módulos donde shared_ptr están en uso que conducen al caos. Esto es muy difícil de resolver, pero en este caso tendría un puntero distinto de cero. Esto no es lo que te está pasando ahora mismo.

 33
Author: jdehaan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-22 12:02:31

Es posible que desee asegurarse de que

Utilice siempre una variable de puntero inteligente con nombre para mantener el resultado de new

Como se recomienda aquí: boost::shared_ptr - Mejores Prácticas

Saludos, Jonny

 3
Author: Jonny Dee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-22 20:40:19