2010-08-07 7 views
11

Je l'extrait de code suivant:test si un shared_ptr est NULL

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 

Suis-je tester correctement? Les docs boost disent qu'un shared_ptr peut être converti implicitement à un bool, mais quand je lance ce code, il 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; 

Répondre

7

Oui, vous testez correctement.

Toutefois, votre problème est probablement dû au déréférencement d'un itérateur non valide. Vérifiez que returnsAnIterator() renvoie toujours un itérateur qui n'est pas vector.end() et le vecteur n'est pas modifié entre les deux, ou vide.

+0

L'itérateur est 'vector.begin()', donc apparemment je testais la mauvaise chose. Merci de votre aide. – Max

8

Oui, le code que vous avez ci-dessus est correct. shared_ptr peut être implicitement converti en booléen pour vérifier la nullité.

Le problème que vous avez est que votre fonction returnAnIterator() renvoie un itérateur invalide. Probablement il retourne end() pour un conteneur, qui est un passé la fin du conteneur, et ne peut donc pas être déréférencé comme vous le faites avec *it.