2010-08-22 34 views
29

que tienen una bastante compleja aplicación multi roscado (servidor) que de vez en cuando se bloqueará debido a una aserción:shared_ptr aserción px = 0 no

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

he sido incapaz de identificar la causa y estaba preguntándome si esto es un problema con boost :: shared_ptr o 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).

+1

Los errores de subprocesos múltiples son difíciles de precisar. Ya que estás en Linux, no hay razón para no usar valgrind, te ayudará a encontrar el error. – nos

+0

Estoy usando valgrind extensamente y obtengo cero errores (con memcheck) hasta que ocurra la afirmación. Todavía estoy aprendiendo cómo interpretar los mensajes de error de drd, ya que la mayoría de ellos (carga de conflicto/almacenar en tipos booleanos/enteros) no parecen ser un problema. – Horacio

Respuesta

33

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

En su caso, está intentando utilizar un puntero compartido no inicializado.

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

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

Aconsejaría inicializarlos en 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 los punteros compartidos no inicializados.

PD: Existen otros problemas si carga/descarga módulos en los que shared_ptr están en uso y conducen al caos. Esto es muy difícil de resolver, pero en este caso tendría un puntero que no sea cero. Esto no es lo que te está sucediendo en este momento.

3

es posible que desee asegurarse de que

siempre utiliza una variable puntero inteligente llamado a aguantar el resultado de la nueva

como se recomienda aquí: boost::shared_ptr - Best Practices

Saludos, Jonny