2010-08-07 10 views
11

He siguiente fragmento de código:prueba si un shared_ptr es NULO

std::vector< boost::shared_ptr<Foo> >::iterator it; 
it = returnsAnIterator(); 
// often, it will point to a shared_ptr that is NULL, and I want to test for that 
if(*it) 
{ 
    // do stuff 
} 
else // do other stuff 

Estoy probando correctamente? Los documentos dicen que impulsar un shared_ptr se puede convertir implícitamente a un bool, pero cuando ejecuto el código que segfaults:

Program received signal SIGSEGV, Segmentation fault. 
0x0806c252 in boost::shared_ptr<Foo>::operator Foo* 
boost::shared_ptr<Foo>::* (this=0x0) 
    at /usr/local/bin/boost_1_43_0/boost/smart_ptr/detail/operator_bool.hpp:47 
47    return px == 0? 0: &this_type::px; 

Respuesta

7

Sí, se está probando correctamente.

Sin embargo, es probable que su problema esté causado por la desreferenciación de un iterador no válido. Compruebe que returnsAnIterator() siempre devuelve un iterador que no es vector.end() y el vector no se modifica entre medio, o está vacío.

+0

El iterador es 'vector.begin()', así que aparentemente estuve probando lo incorrecto. Gracias por tu ayuda. – Max

8

Sí, el código que tiene arriba es correcto. shared_ptr se puede convertir implícitamente en un bool para comprobar la nulidad.

El problema que tiene es que su función returnAnIterator() devuelve un iterador no válido. Probablemente está devolviendo end() para algún contenedor, que es uno pasado al final del contenedor, y por lo tanto no se puede desreferenciar como lo hace con *it.

Cuestiones relacionadas