हाँ, आप समारोह में साझा पॉइंटर को चलाने, तो:
मूल sourcePtr
अशक्त हो जाएगा, और
संदर्भ गिनती संशोधित नहीं होती है।
आप जानते हैं कि तुम अब, समारोह कॉल के बाद sourcePtr
का मूल्य की आवश्यकता होगी यह समारोह में आगे बढ़ एक मामूली अनुकूलन है, के रूप में यह एक परमाणु वेतन वृद्धि (और बाद में घटती बचत होती है, तो जब sourcePtr
गुंजाइश से बाहर चला जाता है)।
हालांकि, सावधान रहें कि पहचानकर्ता sourcePtr
अभी भी शेष दायरे के लिए मान्य है, बस यह एक शून्य सूचक है। जिसका अर्थ यह है कि यदि आप इसे स्थानांतरित करने के बाद उपयोग करते हैं तो संकलक शिकायत नहीं करेगा, लेकिन यदि आप भूल जाते हैं कि इसे स्थानांतरित किया गया था, तो आप सभी संभावनाओं को कमजोर कर देंगे। मैं इस "के अनुकूलन" move
एक बहुत का उपयोग करते हैं, और मैं भी यह द्वारा कई बार काट लिया गया है: और अधिक कार्यक्षमता समारोह में जोड़ा जाता है, और आप move
पूर्ववत करने के लिए भूल जाते हैं, तो आप एक अच्छा दुर्घटना मिलता है।
तो चलती जब आप अब उसे एक मामूली अनुकूलन एक मामूली रखरखाव बोझ के साथ मिलकर है की जरूरत है। वजन घटाने के लिए आप पर निर्भर है जो आपके मामले में अधिक महत्वपूर्ण है।
ऊपर मान लिया गया कोड जो वास्तव में करने के लिए foo
इसकी घोषणा और अंतिम कॉल के बीच sourcePtr
का उपयोग करता है (धन्यवाद यह ओर इशारा करते हुए के लिए @WhozCraig करने के लिए) नहीं है।
foo(std::make_shared<X>(...));
इस तरह, आप परमाणु आपरेशन के एक ही राशि, और बचाने आप की जरूरत नहीं है: अगर वहाँ नहीं है, आप ज्यादा से बेहतर सही कॉल स्थल पर सूचक बनाने होगा एक संभावित खतरनाक खाली साझा सूचक चारों ओर झूठ बोल रहा है।
संक्षेप में, आपको लगता है कि संदर्भ काउंटर में सही वृद्धि नहीं की जाएगी कर रहे हैं। हालांकि मैं इसके लिए एक व्यावहारिक उपयोग को देखने के लिए, जब तक आप सूचक आप पारित खाली किया जाना चाहिए, जिस स्थिति में आप 'बजाय प्रयोग किया जा सकता था std :: unique_ptr' बाध्य करना चाहते हैं असफल।आपको वास्तव में नए पॉइंट पॉइंटर्स को * पॉइंटर * के रूप में नहीं देखना चाहिए, इसके बजाय आपको उन्हें * संसाधन स्वामित्व * परिप्रेक्ष्य से देखना चाहिए। क्या संसाधन का संसाधन केवल एक इकाई ('std :: unique_ptr') या एकाधिक इकाइयों (' std :: shared_ptr') द्वारा किया जा सकता है। –
यह बहुत ही समान प्रश्न है, हालांकि मुझे यकीन नहीं है कि क्या सही डुप्लिकेट है: http://stackoverflow.com/questions/10953325/should-i-stdmove-a-shared-ptr-in-a-move-constructor। यह सवाल कार्य करने के लिए तर्क पारित करने के बारे में है - इस तरह से अलग ... – PiotrNycz
@ जोचिमपिलबोर्ग यह कुछ परीक्षण कोड का एक सरल उदाहरण है, जो पूरी कहानी नहीं बताता है लेकिन मुझे विशेष रूप से उस प्रश्न पर ध्यान केंद्रित करने की अनुमति देता है जिसे मैं जानना चाहता हूं । 'Foo' को मेरे एप्लिकेशन में 'shared_ptr' लेने की आवश्यकता है लेकिन कॉल कोड के बाद परीक्षण कोड को' SourcePtr' की आवश्यकता नहीं है। – ksl