2012-09-14 21 views
16

मैं std::shared_ptr के साथ काम कर रहा हूं और अपने सॉफ्टवेयर विकास के दौरान मैंने कुछ मामलों के से मुलाकात की जो मुझे स्मृति प्रबंधन के बारे में संदेह करते हैं। मेरे पास एक तीसरी पार्टी लाइब्रेरी थी जो ने मुझे हमेशा कार्यों से कच्चे पॉइंटर्स दिए और मेरे कोड में मैं उन्हें std::shared_ptr (std से और बढ़ावा से नहीं) में बदल रहा था। वैसे दोनों के बीच क्या अंतर है?)।सी ++ कच्चा सूचक और std :: shared_ptr

ClassA* raw = new ClassA; 
std::shared_ptr<ClassA> shared(raw); 

अब क्या होता है जब साझा सूचक दायरे से बाहर चला जाता है (मान लें कि यह एक समारोह में स्थानीय रूप से घोषित किया गया था जाने और अब मैं समारोह से बाहर निकल रहा हूँ): तो चलो कहते हैं कि मैं निम्नलिखित कोड डालते हैं। क्या ClassA ऑब्जेक्ट अभी भी मौजूद है क्योंकि कच्चे सूचक यह इंगित कर रहा है?

उत्तर

27

नहीं, यह नहीं होगा। Share_ptr को पॉइंटर देकर आप इसे हटाने के लिए shared_ptr जिम्मेदारियां दे रहे हैं। ऐसा तब होगा जब आखिरी shared_ptr ऑब्जेक्ट इसके प्रति referring ऑब्जेक्ट मौजूद नहीं है। कच्चे पॉइंटर्स गिनते नहीं हैं।

+1

बस एक कारण देने के लिए: shared_ptr कच्चे सूचक पर विचार नहीं करता है क्योंकि कोई भी तरीका नहीं है जिसे साझा_प्टर इसके बारे में जान सकता है। यदि आप इस बारे में सोचते हैं कि आप अपने द्वारा shared_ptr को कैसे कार्यान्वित करेंगे, तो आप देखेंगे कि डेटा का कोई कच्चा पॉइंटर्स नहीं है या नहीं। – Wutz

+1

+1। साथ ही, यही कारण है कि आप 'shared_ptr' बनाते समय उसी पंक्ति पर ऑब्जेक्ट को' नया 'करना चाहिए। इससे भी बेहतर, ['make_shared'] का उपयोग करें (http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared) –

+0

धन्यवाद, असल में मैं मानता हूं कि कच्चे सूचक होने पर कोई रास्ता नहीं है वस्तु को इंगित करना। इस मामले में यह कच्चे सूचक के लिए सिर्फ खतरनाक है क्योंकि यह एक नष्ट वस्तु को इंगित करेगा क्योंकि – ISTB

2

नहीं, ClassA वस्तु नष्ट हो जाएगी। जब तक आपने shared_ptr को कहीं भी गुंजाइश से कॉपी नहीं किया है, तो इसका संदर्भ काउंटर है> 1.

5

नहीं। साझा सूचक इसे हटा देगा।

यदि आपके पास एक पॉइंटर प्रदान करने वाली तीसरी पार्टी लाइब्रेरी है, तो आपको यह सुनिश्चित करना होगा कि आप इसे सही तरीके से हटा दें। यदि तृतीय पक्ष lib ने इसे उदाहरण के लिए 'malloc' के साथ आवंटित किया है, तो आपको lib का उपयोग करने वाले 'मुक्त' के कार्यान्वयन का उपयोग करने की आवश्यकता है। आपको यह सुनिश्चित करने की ज़रूरत है कि इसे आवंटित किया गया था।

क्या लाइब्रेरी ऑब्जेक्ट्स को नष्ट करने का एक तरीका प्रदान करती है जो आपको प्रदान करती है? इस मामले में आपको इसे नष्ट करने के लिए उस फ़ंक्शन का उपयोग करना चाहिए।

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