2010-08-07 9 views
11

मैं निम्नलिखित कोड का टुकड़ा है:परीक्षण करता है, तो एक shared_ptr शून्य है

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 

मैं सही ढंग से परीक्षण हूँ? बढ़ावा डॉक्स का कहना है कि एक shared_ptr परोक्ष एक bool में बदला जा सकता है, लेकिन यह 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; 

उत्तर

7

हाँ, आप इसे सही ढंग से परीक्षण कर रहे हैं।

आपकी समस्या, हालांकि, एक अवैध इटरेटर को डिफ्रेंसिंग के कारण होने की संभावना है। जांचें कि returnsAnIterator() हमेशा एक पुनरावर्तक लौटाता है जो vector.end() नहीं है और वेक्टर को बीच में या खाली में संशोधित नहीं किया गया है।

+0

इटेटरेटर 'vector.begin()' है, इसलिए स्पष्ट रूप से मैं गलत चीज़ का परीक्षण कर रहा था। आपकी सहायता के लिए धन्यवाद. – Max

8

हां, आपके ऊपर जो कोड है वह सही है। shared_ptr को शून्य-नस्ल की जांच के लिए निहित रूप से एक बूल में परिवर्तित किया जा सकता है।

आपके पास समस्या है returnAnIterator() फ़ंक्शन एक अवैध इटरेटर लौटा रहा है। शायद यह कुछ कंटेनर के लिए end() लौटा रहा है, जो कंटेनर के अंत में पिछले है, और इस प्रकार आप *it के साथ कर रहे हैं के रूप में संदर्भित नहीं किया जा सकता है।