2009-02-02 15 views
40

मेरे पास shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe)) जैसा कुछ है अब मुझे सी स्टाइल फ़ंक्शन को कॉल करने की आवश्यकता है जिसके लिए Type पर पॉइंटर की आवश्यकता है। मैं इसे shared_ptr से कैसे प्राप्त करूं? - अन्यथा खराबी हो सकती थी, क्योंकि पुस्तकालय करने के लिए कोशिश कर सकते हैंshare_ptr से सामान्य पीआरआर प्राप्त कर रहा है?

boost::shared_ptr<foo> foo_ptr(new foo()); 
foo *raw_foo = foo_ptr.get(); 
c_library_function(raw_foo); 

सुनिश्चित करें कि आपके shared_ptr क्षेत्र से बाहर जाने नहीं करता पुस्तकालय समारोह इसके साथ किया जाता है से पहले करें:

उत्तर

123

get() विधि का उपयोग करें हटाए जाने के बाद पॉइंटर के साथ कुछ। विशेष रूप से सावधान रहें यदि पुस्तकालय कार्य लौटने के बाद कच्चे सूचक की एक प्रति बनाए रखता है।

+0

आपको शायद c_library_function ने raw_foo के साथ अपनी चीज पूरी करने से पहले साझा_ptr को दायरे से बाहर जाने के बारे में कुछ नोट करना चाहिए। – falstro

+0

रो: मुझे इसके बारे में पता है, मुझे बस पाने के बारे में जानने की जरूरत है :)। धन्यवाद एडम! : डी –

+1

हाय @ एडम रोसेनफील्ड, क्या आप समझा सकते हैं कि परिदृश्य में क्या होता है जहां 'c_library_function' के अंदर कोई अपवाद होता है। इसका मतलब है कि raw_foo लटका दिया गया है? या foo_ptr आगे बढ़ता है और raw_foo को हटा देता है, क्योंकि raw_foo foo_ptr द्वारा आयोजित किया जाता है? – thassan

27

यह & और * ऑपरेटरों के संयोजन का उपयोग करने के लिए किया जाएगा करने के लिए एक और तरीका है:, एक लाभ (यह वास्तव में सही जवाब है) मैं get() विधि का उपयोग करना पसंद करते हैं जबकि व्यक्तिगत रूप से

boost::shared_ptr<foo> foo_ptr(new foo()); 
c_library_function(&*foo_ptr); 

यह है कि इसका उपयोग अन्य वर्गों के साथ किया जा सकता है जो operator* (पॉइंटर ड्रेफरेंस) अधिभारित करते हैं, लेकिन get() विधि प्रदान नहीं करते हैं। उदाहरण के लिए जेनेरिक क्लास टेम्पलेट में उपयोगी हो सकता है।

+0

मुझे आपका जवाब थोड़ा और पसंद आया तो एडम्स, क्षमा करें एडम। –

+3

@ acidzombie24 - मुझे यकीन नहीं है कि आपको यह बेहतर क्यों पसंद है। Get() विधि शायद 99% या अधिक मामलों में उपयोग करने के लिए बेहतर है। –

+0

मैं उपयोग कर रहा हूं लेकिन मुझे अभी भी यह जवाब पसंद है। ज्यादातर बीसी यह सिफारिश करता है कि क्या करना है और क्या नहीं करना है। –

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