नहीं, यह सुरक्षित नहीं है। foo
और bar
आभासी विनाशकों की आवश्यकता है, अन्यथा यह अनिश्चित है कि क्या होता है जब shared_ptr
का विनाशक उस सूचक को हटा देता है जो उसके होल्डिंग को हटा देता है। बेशक, यह कहकर कि यह सुरक्षित नहीं है, यह कहने के समान नहीं है कि इसे दुर्घटनाग्रस्त होना चाहिए।
वैकल्पिक रूप से, वहाँ कुछ जादू है [*] shared_ptr
में बनाया गया है जिसका अर्थ है कि यदि आप foo*
में ढाला नहीं है, तो अपने कोड सुरक्षित हो जाता है:
fooptr f(fb1);
barptr b(fb2);
या तो आभासी नाशक के साथ, या बाहर ले करता है, तो कास्ट, जब share_ptr सूचक को हटाने के लिए आता है, तो संकलक सही विध्वंसकर्ताओं को कॉल करने और स्मृति मुक्त करने के लिए, सूचक को अपने मूल प्रकार पर वापस समायोजित करने के बारे में "पता" करेगा।
जादू केवल काम करता है क्योंकि fb1
टाइप foobar*
है, हालांकि। आभासी नाशक के बिना, निम्नलिखित अभी भी असुरक्षित है:
fooptr f(new foobar());
आप भी अपने कोड में है कि समस्या से बचने कर सकते हैं:
foo *fb = new foobar();
fooptr f(fb);
आप shared_ptr
इस तरह उपयोग करते हैं, तो उस करने का कोई खतरा है , यदि new foobar()
पर दूसरा कॉल अपवाद फेंकता है, तो पहली वस्तु लीक हो जाती है। आप shared_ptr
उपयोग करने के लिए आप के लिए स्मृति का प्रबंधन करने जा रहे हैं, तो आप जल्दी से जल्दी प्रबंधन के तहत स्मृति प्राप्त करने की आवश्यकता:
fooptr f(new foobar());
barptr b(new foobar());
अब अगर दूसरी पंक्ति फेंकता है, f
ठीक से विलुप्त हो जाएगा और नष्ट करेगा उदेश्य।
[*] "जादू" = एक कन्स्ट्रक्टर टेम्पलेट, जो shared_ptr
में एक फ़ंक्शन के लिए एक पॉइंटर में संग्रहीत करता है जो संग्रहित पॉइंटर को सही प्रकार पर वापस लाएगा, और उसके बाद इसे हटा देगा।
+1, आपने टेम्पलेट कन्स्ट्रक्टर को समझाते हुए मुझे हराया। –
आपके उत्तर के लिए धन्यवाद :) – ddh