2013-03-18 10 views
23

की अनुशंसित उपयोग std::unique_ptr के अनुशंसित उपयोगों के लिए विशेष रूप से कहां, कब, और इसका सर्वोत्तम उपयोग कैसे किया जाता है?std :: unique_ptr

मुझे पता चला:

About unique_ptr performances

मैं पहले से ही पता:

  1. std::unique_ptr एक std::unique_ptr कोई संदर्भ गिनती है कि सी ++ 11 के लिए std::auto_ptr
  2. एक स्थानापन्न के रूप में विकसित किया गया था और "मालिक" ऑब्जेक्ट यह
  3. पर कोई प्रतिलिपि नहीं है एक std::unique_ptr
  4. साथ ssign जब मैं एक अद्वितीय सूचक की जरूरत है, std::unique_ptr जाने की संरचना करने के

मैं जानना चाहूंगा क्या है:

  1. (विशिष्टता के अतिरिक्त) एक std::unique_ptr कभी बेहतर का उपयोग कर रहा है कुछ
    अन्य के लिए? इस स्थिति में मुझे क्या फायदा होगा?
  2. यदि हां, तो किस परिस्थिति में और कब?
  3. चाल semantics की आवश्यकता को देखते हुए, यह std::unique_ptr कम अनुकूल
    कुल मिलाकर?
  4. तो एक std::shared_ptr लगभग हर स्थिति में गतिशील स्मृति प्रबंधन के लिए पर्याप्त होगा, क्यों (, फिर विशिष्टता के अलावा अन्य
    ) मेरी निपटान होने पर पड़ता है एक std::unique_ptr बात?
+2

के बाद प्रकार कहा जाता है 'unique_ptr', मैं यह अजीब आप से किया जा रहा अद्वितीय ... –

+2

अन्य उपयोग के लिए खोज कर रहे हैं और लगता है [सूचक की किस तरह मैं प्रयोग करते हैं जब?] (Http://stackoverflow.com/क्यू/8706192/256138) – rubenvb

+1

@ मशी: आपको जिस मुख्य प्रश्न का उत्तर देने की आवश्यकता है वह स्वामित्व का है। स्मार्ट पॉइंटर की पसंद में कुछ भी मायने नहीं रखता है, और जिन सवालों से मैंने लिंक किया है, उनका उत्तर बहुत अच्छा है। आपके द्वारा लिंक किए गए प्रश्न में मेरा डाउनवोट था (पहले से) क्योंकि यह कुछ भी निश्चित नहीं दिखाता है और "डेटा" के बारे में गलत सवाल पूछता है। – rubenvb

उत्तर

7

सिद्धांत रूप में, आप सभी संकेत दिए गए हैं जब तक आप जानते हैं कि आप इसे साझा करना चाहते, जिस स्थिति में आप shared_ptr का उपयोग करना चाहिए के लिए unique_ptr उपयोग करना चाहिए। इसका कारण यह है कि unique_ptr में कम ओवरहेड है क्योंकि यह संदर्भों की गणना नहीं करता है।

हालांकि, एक unique_ptr, जंगम लेकिन copyable नहीं है तो एक सदस्य चर के रूप में एक का उपयोग कर अधिक कोड (जैसे एक कदम निर्माता) लिखने के लिए आप की आवश्यकता कर सकते हैं, मूल्य से एक गुजर मतलब है कि आप std::move और इतने पर का उपयोग करना होगा । नतीजतन कुछ लोग आलस्य से shared_ptr का उपयोग करते हैं, क्योंकि यह आसान है, और उनके ऐप के लिए perf अंतर महत्वपूर्ण नहीं हो सकता है।

अंत में एक कच्चा सूचक अवलोकन के लिए ठीक है - सूचक उपयोग जो जीवनकाल को कभी प्रभावित नहीं कर सकता है। सही पॉइंटर प्रकार की सावधानीपूर्वक पसंद उन लोगों को दे सकती है जो आपके कोड को आप जो कर रहे हैं उसकी अच्छी समझ पढ़ते हैं। अधिक जानकारी के लिए, हर्ब सटर के निबंध, Elements of C++ Style देखें, विशेष रूप से "कोई हटाएं" खंड।

+1

'= डिफ़ॉल्ट 'और निहित चालक सदस्य आसानी से अतिरिक्त कोड का ख्याल रख सकते हैं। – Puppy

+0

यदि आपको 'unique_ptr' जोड़ने से पहले एक स्पष्ट चालक कन्स्ट्रक्टर की आवश्यकता नहीं है, तो आपको बाद में एक स्पष्ट चालक कन्स्ट्रक्टर की आवश्यकता नहीं है। एकमात्र ऐसी स्थिति जिसमें आपको अधिक कोड लिखना होगा, जब आप ऐसा कुछ करेंगे जो निहित चालक कन्स्ट्रक्टर को अक्षम करता है। – Cubic

+0

@DeadMG मैं अभी भी अपने कंपाइलर में = डिफ़ॉल्ट के लिए प्रतीक्षा कर रहा हूं, लेकिन हाँ –

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