2010-08-22 14 views
29

मैं एक काफी जटिल बहु लड़ी आवेदन (सर्वर) कि समय-समय पर एक ज़ोर की वजह से दुर्घटना होगा:shared_ptr अभिकथन px = 0 में विफल रहा है

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

मैं कारण का पता नहीं लगा पाए और था यह सोचकर कि क्या यह boost :: shared_ptr के साथ एक समस्या है या यह मैं हूं?

मैंने ऑप्टिमाइज़ेशन और ऑप्टिमाइज़ेशन और libboost1.40-dev (= 1.40.0-4ubuntu4) के बिना g ++ 4.4.3-4ubuntu5 और llvm-g ++ (GCC) 4.2.1 का प्रयास किया।

+1

मल्टीथ्रेडिंग बग को इंगित करना मुश्किल है। चूंकि आप लिनक्स पर हैं, इसलिए वाल्ग्रिंड का उपयोग करने का कोई कारण नहीं है - इससे आपको बग को खोजने में मदद मिलेगी। – nos

+0

मैं बड़े पैमाने पर वालग्रिंड का उपयोग कर रहा हूं और जब तक हमला नहीं होता तब तक मुझे शून्य त्रुटियां (memcheck के साथ) मिलती है। मैं अभी भी सीख रहा हूं कि ड्रड त्रुटि संदेशों की व्याख्या कैसे करें क्योंकि उनमें से अधिकतर (बूलियन/पूर्णांक प्रकारों पर संघर्ष लोड/स्टोर) कोई समस्या नहीं है। – Horacio

उत्तर

33

boost::shared_ptr का उपयोग करने में कोई समस्या नहीं होनी चाहिए जब तक कि आप अपने साझा पॉइंटर्स को सही तरीके से प्रारंभ न करें और अपने सभी साझा ऑब्जेक्ट लाइब्रेरीज़ के लिए समान स्मृति प्रबंधन संदर्भ का उपयोग करें।

आपके मामले में आप एक अनियमित साझा पॉइंटर का उपयोग करने का प्रयास कर रहे हैं।

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

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

मैं सलाह देता हूं कि जब भी संभव हो तो घोषणा पर उन्हें सही शुरू करें। अपवाद हैंडलिंग कोड चलाने के लिए बहुत सारे "अदृश्य" पथ बना सकता है और गैर प्रारंभिक साझा पॉइंटर्स की पहचान करना मुश्किल हो सकता है।

पीएस: यदि आप मॉड्यूल लोड/अनलोड करते हैं तो अन्य समस्याएं हैं जहां shared_ptr अराजकता के कारण उपयोग में हैं। यह हल करना बहुत मुश्किल है लेकिन इस मामले में आपके पास शून्य शून्य सूचक होगा। यह अभी आपके साथ नहीं हो रहा है।

3

आप सुनिश्चित करें कि आप

हमेशा एक नामित स्मार्ट सूचक चर का उपयोग नई

का परिणाम पकड़ करने के लिए की तरह इसे यहाँ की सिफारिश की है बनाने के लिए चाहते हो सकता है: boost::shared_ptr - Best Practices

सादर, जॉनी

संबंधित मुद्दे