मैं std::shared_ptr
के साथ काम कर रहा हूं और अपने सॉफ्टवेयर विकास के दौरान मैंने कुछ मामलों के से मुलाकात की जो मुझे स्मृति प्रबंधन के बारे में संदेह करते हैं। मेरे पास एक तीसरी पार्टी लाइब्रेरी थी जो ने मुझे हमेशा कार्यों से कच्चे पॉइंटर्स दिए और मेरे कोड में मैं उन्हें std::shared_ptr
(std से और बढ़ावा से नहीं) में बदल रहा था। वैसे दोनों के बीच क्या अंतर है?)।सी ++ कच्चा सूचक और std :: shared_ptr
ClassA* raw = new ClassA;
std::shared_ptr<ClassA> shared(raw);
अब क्या होता है जब साझा सूचक दायरे से बाहर चला जाता है (मान लें कि यह एक समारोह में स्थानीय रूप से घोषित किया गया था जाने और अब मैं समारोह से बाहर निकल रहा हूँ): तो चलो कहते हैं कि मैं निम्नलिखित कोड डालते हैं। क्या ClassA
ऑब्जेक्ट अभी भी मौजूद है क्योंकि कच्चे सूचक यह इंगित कर रहा है?
बस एक कारण देने के लिए: shared_ptr कच्चे सूचक पर विचार नहीं करता है क्योंकि कोई भी तरीका नहीं है जिसे साझा_प्टर इसके बारे में जान सकता है। यदि आप इस बारे में सोचते हैं कि आप अपने द्वारा shared_ptr को कैसे कार्यान्वित करेंगे, तो आप देखेंगे कि डेटा का कोई कच्चा पॉइंटर्स नहीं है या नहीं। – Wutz
+1। साथ ही, यही कारण है कि आप 'shared_ptr' बनाते समय उसी पंक्ति पर ऑब्जेक्ट को' नया 'करना चाहिए। इससे भी बेहतर, ['make_shared'] का उपयोग करें (http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared) –
धन्यवाद, असल में मैं मानता हूं कि कच्चे सूचक होने पर कोई रास्ता नहीं है वस्तु को इंगित करना। इस मामले में यह कच्चे सूचक के लिए सिर्फ खतरनाक है क्योंकि यह एक नष्ट वस्तु को इंगित करेगा क्योंकि – ISTB