2008-10-13 9 views
19

अब shared_ptr tr1 में है, आपको क्या लगता है कि std::auto_ptr के उपयोग के साथ क्या होना चाहिए? दोनों के पास अलग-अलग उपयोग के मामले हैं, लेकिन auto_ptr के सभी उपयोग मामलों को भी shared_ptr के साथ हल किया जा सकता है। क्या आप auto_ptr को छोड़ देंगे या उन मामलों में इसका उपयोग जारी रखेंगे जहां आप स्पष्ट रूप से व्यक्त करना चाहते हैं कि किसी एक बिंदु पर केवल एक वर्ग का स्वामित्व है?std :: auto_ptr का Idiomatic उपयोग या केवल shared_ptr का उपयोग करें?

मेरा लेना यह है कि auto_ptr का उपयोग करके कोड में स्पष्टता जोड़ सकती है, ठीक से कोड के डिजाइन के संकेत को जोड़कर, लेकिन दूसरी तरफ, नए प्रोग्रामर को प्रशिक्षण देते समय यह एक और सूक्ष्म मुद्दा जोड़ता है: उन्हें स्मार्ट पॉइंटर्स और उनके काम के बारे में बढ़िया विवरण समझें। जब आप हर जगह केवल एक स्मार्ट पॉइंटर का उपयोग करते हैं, तो आप बस shared_ptr में सभी पॉइंटर्स को लपेट सकते हैं और इसके साथ किया जा सकता है।

इस पर आपका क्या लेना है?

उत्तर

13

'std::auto_ptr' शिविर से बचने के लिए थोड़ा और गोला बारूद प्रदान करने के लिए: auto_ptr अगले मानक (सी ++ 0x) में बहिष्कृत किया जा रहा है। मुझे लगता है कि यह अकेले कुछ और उपयोग करने के लिए किसी भी तर्क के लिए पर्याप्त गोला बारूद अच्छा है।

हालांकि, Konrad Rudolph के अनुसार, auto_ptr के लिए डिफ़ॉल्ट प्रतिस्थापन शायद boost::scoped_ptr होना चाहिए। scoped_ptr के अर्थशास्त्र auto_ptr के अधिक निकटता से मेल खाते हैं और यह समान उपयोगों के लिए है। अगले सी ++ 09 मानक में कुछ विशिष्ट होगा जिसे unique_ptr कहा जाता है।

हालांकि, shared_ptr का उपयोग करके कहीं भी scoped_ptr का उपयोग किया जाना चाहिए, तो कुछ भी तोड़ नहीं होगा, अगर संदर्भ वास्तव में साझा नहीं किया जा रहा है तो संदर्भ संदर्भ से निपटने के लिए यह बहुत ही कम अक्षमता को जोड़ देगा। तो निजी सदस्य पॉइंटर्स के लिए जो किसी अन्य ऑब्जेक्ट को कभी नहीं सौंपे जाएंगे - scoped_ptr का उपयोग करें। यदि सूचक कुछ और को सौंप दिया जाएगा (इसमें कंटेनर में उनका उपयोग करना शामिल है या यदि आप जो करना चाहते हैं वह स्वामित्व हस्तांतरण है और इसे साझा या साझा नहीं करता है) - shared_ptr का उपयोग करें।

+3

माइक, दुर्भाग्य से कोई 'tr1 :: scoped_ptr' नहीं है। जाहिर है वे इसे सरल रखना चाहते थे। मुझे TR2 में स्थिति के बारे में पता नहीं है, लेकिन अगले मानक के बजाय 'unique_ptr'' पेश करेंगे, मुझे संदेह है कि 'scoped_ptr' होगा। –

+0

इसके बारे में क्षमा करें - आप सही हैं। –

+0

इसे स्वीकार किया गया, यह नहीं पता था कि auto_ptr को बहिष्कृत किया जा रहा था। जैसा कि आप कहते हैं, वह अकेले इसका उपयोग करने का एक आधिकारिक कारण नहीं है; हालांकि, मुझे एमएसल्टर्स का 'रिलाइक्श स्वामित्व अर्थशास्त्र' का उदाहरण पसंद आया। – Roel

3

मेरा मानना ​​है कि "shared_ptr में सभी पॉइंटर्स को लपेटें" वास्तव में डिफ़ॉल्ट मोड होना चाहिए, और आपके जूनियर कोडर्स को देने के लिए उपयुक्त सलाह है। हालांकि, आपके द्वारा उल्लिखित विशेष स्वामित्व के मामलों में, auto_ptr वास्तव में अधिक उपयुक्त है और इस तरह के परिस्थितियों में इसका उपयोग प्रोत्साहित किया जाना चाहिए।

5

मुझे विश्वास है कि यह है boost::scoped_ptr द्वारा std::auto_ptr के सभी उपयोगों स्थानापन्न करने अगर आप बूस्ट का उपयोग कर कोई आपत्ति नहीं है सबसे अच्छा अभ्यास जब तक std::tr1::shared_ptr आवश्यकताओं बेहतर मिलता है,। दूसरी तरफ, यह निश्चित रूप से जानबूझकर था कि scoped_ptr टीआर 1 में शामिल नहीं था।

+0

scoped_ptr का उपयोग है, यानी एकल-स्वामित्व जिसे हस्तांतरण की आवश्यकता नहीं है। उन मामलों में, इसे auto_ptr की जगह लेनी चाहिए। हालांकि, जहां एकल-स्वामित्व, हस्तांतरण अर्थशास्त्र उचित है, auto_ptr अभी भी उपयोग किया जाना चाहिए। :-) –

+0

क्या एक कॉन्स auto_ptr से scoped_ptr बेहतर बनाता है? असाधारण सी ++ में auto_ptr के बारे में एक आइटम है और विशेष रूप से कॉन्स्ट auto_ptr के बारे में एक पैराग्राफ है; scoped_ptr के बारे में पढ़ने से मुझे एक कॉन्स auto_ptr पर कोई लाभ नहीं दिख रहा है। – Roel

+0

'auto_ptr' स्वामित्व उत्पन्न कर सकता है। अक्सर, यह आवश्यक नहीं है। असल में, एक 'scoped_ptr' किसी दिए गए ब्लॉक में मनमाने ढंग से सूचक के लिए केवल RAII लागू करता है। –

11

"हर जगह shared_ptr का उपयोग करें" एक अच्छा डिफ़ॉल्ट नियम है, और निश्चित रूप से स्मार्ट पॉइंटर्स के जिम्मेदार उपयोग के बारे में लोगों को सिखाने के लिए एक अच्छा प्रारंभिक बिंदु है। हालांकि, यह हमेशा सबसे अच्छा विकल्प नहीं है।

यदि आपको साझा स्वामित्व की आवश्यकता नहीं है, तो shared_ptr अधिक है: इसे संदर्भ गणना के लिए एक अलग मेमोरी ब्लॉक आवंटित करना है, जो प्रदर्शन को प्रभावित कर सकता है, और यह कम स्पष्ट दस्तावेज-वार है।

व्यक्तिगत रूप से, मैं std::auto_ptr का उपयोग कई स्थानों पर करता हूं जहां boost::scoped_ptr भी पर्याप्त होगा: उदा। स्वामित्व को कहीं और स्थानांतरित करने से पहले एक ढेर-आवंटित ऑब्जेक्ट धारण करना, जहां हस्तक्षेप के संचालन फेंक सकते हैं।

C++ 0x std::auto_ptr के लिए एक बेहतर विकल्प के रूप में std::shared_ptr पूरक std::unique_ptr होगा। जब यह व्यापक रूप से उपलब्ध हो जाता है तो मैं इसका उपयोग करना शुरू कर दूंगा।

28

auto_ptr हस्ताक्षर में भी अच्छा है। जब कोई फ़ंक्शन मान द्वारा auto_ptr<T> लेता है, तो इसका अर्थ है कि यह T का उपभोग करेगा। यदि कोई फ़ंक्शन auto_ptr<T> देता है, तो यह स्पष्ट है कि यह स्वामित्व को छोड़ देता है। यह आपके इरादे को जीवन भर के बारे में बता सकता है।

दूसरी ओर, scoped_ptr<T> का उपयोग करके तात्पर्य है कि आप T के जीवनकाल की परवाह नहीं करना चाहते हैं। इसका यह भी अर्थ है कि आप इसे अधिक स्थानों पर उपयोग कर सकते हैं। स्मार्ट पॉइंटर्स दोनों वैध विकल्प हैं, आप निश्चित रूप से एक ही कार्यक्रम में दोनों हो सकते हैं।

+2

ऑटो_प्टर के लिए क्या उपयोग किया जाना चाहिए इसका सबसे अच्छा विवरण। –

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