2010-03-15 10 views
5

मुझे वस्तुओं को साझा करने की ज़रूरत नहीं है, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि कोई स्मृति रिसाव न हो। क्या इस मामले में shared_ptr का उपयोग करना सही है?मैं auto_ptr के std :: vector का उपयोग नहीं कर सकता - क्या मुझे shared_ptr का उपयोग करना चाहिए?

+3

वेक्टर में आवंटित वस्तुओं को गतिशील रूप से आवंटित किया गया है? क्या उन्हें होना है? –

उत्तर

7

यदि आप बूस्ट का उपयोग कर रहे हैं, तो boost::ptr_vector आपकी आवश्यकताओं के लिए बेहतर अनुकूल हो सकता है।

यदि नहीं, तो आप या तो shared_ptr का उपयोग कर सकते हैं जैसा कि आपने सुझाव दिया है या वेक्टर के तत्वों को मैन्युअल रूप से हटाए जाने के बाद मैन्युअल रूप से हटा दें।

रखरखाव बिंदु से, shared_ptr पसंदीदा समाधान होगा। नोट, हालांकि, shared_ptr कुछ प्रदर्शन दंड ला सकता है, जो आपके आवेदन के लिए महत्वपूर्ण हो सकता है या नहीं भी हो सकता है।

2

यह एक ओवरकिल का थोड़ा सा है, लेकिन इसके लिए कोई बेहतर स्मार्ट पॉइंटर नहीं है। आप बूस्ट के सूचक कंटेनरों पर भी विचार कर सकते हैं।

सी ++ 0x में आप कंटेनर में std::unique_ptr स्टोर करने में सक्षम होंगे, जो आपकी आवश्यकताओं के करीब है।

+0

मैं unique_ptr के कंटेनर के लिए boost :: shared_ptr – amitlicht

+0

+1 का उपयोग कर रहा हूं! – AshleysBrain

1

आप Boost.PointerContainer का भी उपयोग कर सकते हैं। shared_ptr का उपयोग साझा स्वामित्व व्यक्त करता है। अब यदि आप सुनिश्चित हैं कि आपकी वस्तुएं कंटेनर के जीवनकाल तक सीमित हैं, तो PointerContainer बेहतर विकल्प डिज़ाइन-वार है (क्या यह भी एक शब्द है?)।

4

यदि निम्न स्तर का प्रदर्शन/स्मृति उपयोग महत्वपूर्ण आवश्यकताओं (यानी सभी मामलों का 9 7%) नहीं है तो बस shared_ptr के साथ जाएं। यह सीधा और अच्छी तरह से समझ में आता है।

यदि आप वास्तव में चीजों को कसकर रखना चाहते हैं और/या स्वामित्व के इरादे को व्यक्त करना चाहते हैं तो boost::ptr_vector बेहतर हो सकता है - लेकिन यदि आपकी कक्षा किसी अन्य मेमोरी का प्रबंधन नहीं करती है तो बस आपके विनाशक को मैन्युअल रूप से हटाने से बड़ा नहीं होता है पाप के रूप में हमें कभी-कभी विश्वास होता है ;-) मैं एक बड़ा राई समर्थक हूं, लेकिन समय-समय पर यह भी करता हूं।

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