2012-12-17 17 views
27

क्या सी ++ 11 में boost::intrusive_ptr के बराबर कुछ है?intrusive_ptr सी ++ 11

मेरी समस्या यह है कि मेरे सी ++ कोड पर सी-स्टाइल इंटरफेस है। इंटरफ़ेस के दोनों पक्ष सी ++ का उपयोग कर सकते हैं, लेकिन सी इंटरफेस को उजागर करने के लिए संगतता कारणों के लिए आवश्यक है। मैं std::shared_ptr का उपयोग नहीं कर सकता क्योंकि मुझे ऑब्जेक्ट को दो (या अधिक) स्मार्ट पॉइंटर्स के माध्यम से प्रबंधित करना है। मैं boost::intrusive_ptr जैसे कुछ के साथ समाधान का पता लगाने में असमर्थ हूं।

+0

आप एक कस्टम डिलीटर के साथ 'unique_ptr' के आस-पास एक रैपर का उपयोग करके' intrusive_ptr' कार्यान्वयन कर सकते हैं, जिससे आप थ्रेड सुरक्षित (या नहीं) संदर्भ गणना कर सकते हैं। यह पास करना आसान नहीं है (चलने की आवश्यकता है, या मैन्युअल रूप से रेफरी गिनती में हेरफेर करना), लेकिन यह संभव है। – Chad

उत्तर

33

क्या सी ++ 11 में boost :: intrusive_ptr को बढ़ावा देने के बराबर कुछ है?

सं

यह std::make_shared जो std::shared_ptr का मतलब है है लगभग एक घुसपैठ स्मार्ट सूचक के रूप में के रूप में कुशल (नीचे नोट देखें), क्योंकि संदर्भ में गिना जाता है वस्तु ही स्मृति में आसन्न संग्रहीत किया जाएगा , संदर्भ और कैश उपयोग के इलाके में सुधार। यह std::enable_shared_from_this भी प्रदान करता है जो आपको std::shared_ptr पुनर्प्राप्त करने की अनुमति देता है जब आपके पास केवल shared_ptr के स्वामित्व वाली किसी ऑब्जेक्ट में अंतर्निहित पॉइंटर होता है, लेकिन यह आपको विभिन्न स्मार्ट पॉइंटर प्रकारों का उपयोग करके ऑब्जेक्ट को प्रबंधित करने की अनुमति नहीं देता है।

shared_ptr ऑब्जेक्ट के प्रबंधन के लिए पूरी तरह उत्तरदायी होने की अपेक्षा करता है। एक अलग स्मार्ट सूचक प्रकार केवल "मजबूत" refcount का प्रबंधन कर सकता है, न कि "कमजोर" refcount, जो गणना को सिंक से बाहर निकलने और shared_ptr के आविष्कार तोड़ने की अनुमति देगा।


नोट: make_shared का उपयोग shared_ptrलगभग के रूप में एक घुसपैठ सूचक के रूप में कुशल होने के लिए अनुमति देता है। make_shared का उपयोग होने पर ऑब्जेक्ट और संदर्भ गिनती जानकारी को स्मृति के एक खंड में आवंटित किया जा सकता है, लेकिन अभी भी दो संदर्भ गणनाएं होंगी ("मजबूत" और "कमजोर" गणनाओं के लिए) जो घुसपैठ करने वाले पॉइंटर्स के मामले में नहीं है क्योंकि वे weak_ptr का समर्थन नहीं करते हैं। साथ ही, shared_ptr ऑब्जेक्ट को हमेशा दो पॉइंटर्स को स्टोर करना होता है (वह जिसे shared_ptr::get() द्वारा वापस किया जाएगा और "नियंत्रण ब्लॉक" में एक अन्य पॉइंटर जिसमें संदर्भ गणना होती है और स्वामित्व वाली वस्तु के डायनामिक प्रकार को जानता है) तो इसमें एक बड़ा पदचिह्न है एक घुसपैठ सूचक से।

+9

_intrusive पॉइंटर्स जो कमजोर_ptr_ का समर्थन नहीं करते हैं - स्पष्टीकरण के लिए: घुसपैठ करने वाले पॉइंटर्स डिज़ाइन द्वारा (थ्रेड-सुरक्षित) weak_ptr का समर्थन नहीं कर सकते हैं। रेफकाउंट को ऑब्जेक्ट के बाहर संग्रहीत करने की आवश्यकता है, अन्यथा कमजोर सूचक पर किसी भी लॉक प्रयास वस्तु के विनाश के साथ दौड़ जाएगा। दूसरे शब्दों में: प्रत्येक कमजोर सूचक ने रिफाउंट पर स्वामित्व साझा किया है। तो अगर रिफाउंटर ऑब्जेक्ट से अविभाज्य है (जैसा कि घुसपैठ करने वाला सूचक है), तो कमजोर पॉइंटर के पास भी ऑब्जेक्ट पर स्वामित्व साझा किया गया है, जो एक कमजोर सूचक की अवधारणा का विरोध करता है। – ComicSansMS

+1

@ कॉमिकसंसएमएस, वास्तव में - यह मेरे हिस्से पर खराब शब्द था। मैंने थोड़ा नोट फिर से लिखा है और मुझे उम्मीद है कि यह स्पष्ट है। धन्यवाद। –

+2

@ कॉमिकसन्सएमएस यह धागे के साथ सिर्फ एक समस्या नहीं है: कमजोर पॉइंटर्स यह जांच नहीं सकते हैं कि ऑब्जेक्ट अभी भी जिंदा है या नहीं, क्योंकि अगर इसे पहले से ही नष्ट कर दिया गया है तो वे 'फ्री' मेमोरी – pqnet