बेहतर जीवन की चाह के लिए, ब्रेज़ेन में रहने वाली दुनिया बहुत ... शैक्षणिक है। यदि आपके कोड को डिज़ाइन और संरचित किया जा सकता है जैसे कि वस्तुओं में बहुत ही जानबूझकर संबंधपरक पदानुक्रम होते हैं, जैसे कि स्वामित्व संबंध कठोर और अनियंत्रित होते हैं, तो कोड एक दिशा में बहता है (उच्च-स्तर से निम्न-स्तर तक), और ऑब्जेक्ट केवल उन निम्न में बात करते हैं पदानुक्रम, तो आप के लिए बहुत जरूरत नहीं मिलेगी shared_ptr। यह कुछ ऐसा है जो आप उन दुर्लभ अवसरों पर उपयोग करते हैं जहां किसी को नियमों को तोड़ना पड़ता है। लेकिन अन्यथा, आप केवल vectorएस या अन्य डेटा संरचनाओं में सब कुछ चिपका सकते हैं जो मूल्य शब्दार्थ का उपयोग करते हैं, और unique_ptrउन चीजों के लिए जो आपको अकेले आवंटित करना है।
जबकि वह रहने के लिए एक महान दुनिया है, यह वह नहीं है जो आपको हर समय मिलता है। यदि आप अपने कोड को उस तरह से व्यवस्थित नहीं कर सकते हैं , क्योंकि सिस्टम का डिज़ाइन जो आप बनाने की कोशिश कर रहे हैं, इसका मतलब है कि यह असंभव है (या बस गहराई से अप्रिय), तो आप अपने आप को वस्तुओं के साझा स्वामित्व की आवश्यकता को खोजने जा रहे हैं। ।
इस तरह की व्यवस्था में, नग्न बिंदुओं को पकड़ना ... बिल्कुल खतरनाक नहीं है, लेकिन यह सवाल उठाता है। इसके बारे shared_ptrमें महान बात यह है कि यह वस्तु के जीवनकाल के बारे में उचित वाक्यविन्यास प्रदान करता है । क्या इसे तोड़ा जा सकता है? बेशक। लेकिन लोग const_castबातें भी कर सकते हैं; बुनियादी देखभाल और खिलाने के shared_ptrलिए आवंटित वस्तुओं के लिए जीवन की उचित गुणवत्ता प्रदान करनी चाहिए जिन्हें स्वामित्व साझा किया जाना चाहिए।
फिर, वहाँ weak_ptrएस, जो अनुपस्थिति में इस्तेमाल नहीं किया जा सकता है shared_ptr। यदि आपका सिस्टम कठोर रूप से संरचित है, तो आप किसी ऑब्जेक्ट को एक नग्न पॉइंटर को स्टोर कर सकते हैं, इस ज्ञान में सुरक्षित है कि एप्लिकेशन की संरचना यह सुनिश्चित करती है कि ऑब्जेक्ट आपको इंगित करेगा। आप एक फ़ंक्शन को कॉल कर सकते हैं जो कुछ आंतरिक या बाह्य मान के लिए एक पॉइंटर लौटाता है (उदाहरण के लिए एक्स नामक ऑब्जेक्ट ढूंढें)। ठीक से संरचित कोड में, वह फ़ंक्शन केवल आपके लिए उपलब्ध होगा यदि ऑब्जेक्ट का जीवनकाल आपके खुद से अधिक होने की गारंटी हो; इस प्रकार, उस नग्न सूचक को अपनी वस्तु में संग्रहीत करना ठीक है।
चूंकि उस कठोरता को वास्तविक प्रणालियों में प्राप्त करना हमेशा संभव नहीं होता है, इसलिए आपको जीवनकाल सुनिश्चित करने के लिए किसी तरह की आवश्यकता होती है । कभी-कभी, आपको पूर्ण स्वामित्व की आवश्यकता नहीं होती है; कभी-कभी, आपको केवल यह जानने में सक्षम होना चाहिए कि सूचक खराब या अच्छा कब है। यही कारण है कि जहां है weak_ptrमें आता है। ऐसे मामले मैं किया गया है हो सकता है एक का इस्तेमाल किया है unique_ptrया boost::scoped_ptrहै, लेकिन मैं एक का उपयोग करने के लिए किया था shared_ptr, क्योंकि मैं विशेष रूप से किसी को एक "अस्थिर" सूचक देने के लिए की जरूरत है। एक सूचक जो जीवन भर अनिश्चित था, और वे उस सूचक को नष्ट होने पर क्वेरी कर सकते थे।
दुनिया की स्थिति के अनिश्चित होने पर जीवित रहने का एक सुरक्षित तरीका।
पॉइंटर को पाने के लिए कुछ फंक्शन कॉल द्वारा किया जा सकता था, इसके बजाय weak_ptr? हां, लेकिन यह आसानी से टूट सकता है। एक फ़ंक्शन जो एक नग्न पॉइंटर लौटाता है, उसके पास सिंटैक्टिक रूप से यह सुझाव देने का कोई तरीका नहीं है कि उपयोगकर्ता कुछ ऐसा नहीं करता है जो पॉइंटर को दीर्घकालिक बनाता है। किसी को लौटाना shared_ptrभी किसी के लिए इसे आसानी से संग्रहीत करना आसान बनाता है और संभवतः किसी वस्तु के जीवन-काल को लम्बा खींचता है। एक weak_ptrजोरदार रिटर्निंग से पता चलता है कि shared_ptrआपके द्वारा प्राप्त किया lockजा रहा भंडारण एक ... संदिग्ध विचार है। यह आपको ऐसा करने से नहीं रोकेगा, लेकिन C ++ में कुछ भी आपको कोड तोड़ने से नहीं रोकता है। weak_ptrप्राकृतिक काम करने से कुछ न्यूनतम प्रतिरोध प्रदान करता है।
अब, यह कहना है कि नहीं है shared_ptrनहीं किया जा सकता overused ; यह निश्चित रूप से कर सकते हैं। विशेष रूप से पूर्व- unique_ptr, ऐसे कई मामले थे जहां मैंने सिर्फ boost::shared_ptrइसलिए इस्तेमाल किया क्योंकि मुझे एक आरएआई पॉइंटर पास करने की आवश्यकता थी या इसे एक सूची में डाल दिया था। चाल शब्दार्थ के बिना और unique_ptr, boost::shared_ptrएकमात्र वास्तविक समाधान था।
और आप इसे उन जगहों पर उपयोग कर सकते हैं जहां यह काफी अनावश्यक है। जैसा कि ऊपर कहा गया है, उचित कोड संरचना के कुछ उपयोगों की आवश्यकता को समाप्त कर सकता है shared_ptr। लेकिन अगर आपके सिस्टम को इस तरह से संरचित नहीं किया जा सकता है और फिर भी इसे करने की आवश्यकता है, तो यह shared_ptrमहत्वपूर्ण उपयोग होगा।